home *** CD-ROM | disk | FTP | other *** search
Text File | 2006-10-19 | 285.9 KB | 6,481 lines |
-
-
- ============================================================================
-
- TI Hardware Manual.
-
- This document started life as a compendium of information on different
- memory acess methods for memory cards on the TI-99/4a home computer.
-
- Different pieces of good technical messages and articles have been sewn
- together that were sitting around on my hard drive. My hope is that
- this information will be of use to other remaining TI Hobbyist.
-
- This compendium of information is copyrighted material of Dan Eicher,
- and my not be edited, changed or redistributed.
-
- All articles and message, individually remain the exclusive property
- of their authors.
-
- As time permits I will add more information to this document. If you have
- anything you wouldn't mind contributing, I will be pleased to add it.
-
- If you find information that is in error, please send me an update and that
- will also be added. If you have comments like, gee... can you add this
- that or the other, or I would have done it this way ect... Please send
- all of these comments to NoOneCares@Null.Com.
-
-
-
- Thanks to the following TI Enthusist for their contributions:
-
- Paolo Bagnaresi
- Jerry Coffey
- Bruce Harrison
- Beery Miller
- Jim Ness
- David Nieters
- Thierry Nouspikel
- Don O'Neil
- David Ormand
- Jeff H. White
-
-
- Dan H. Eicher
- Eicher@Delphi.Com
- www.delphi.com/people/eicher
-
- L.D.O.M. 12.29.96
-
- ==========================================================================
-
- INDEX
-
-
- Myarc 512K Memory Card.
- From Myarc Documentation....................................DTIHM001
-
- Foundation 128K Memory Card.
- From Foundation Documentation...............................DTIHM002
-
- Rambo.
- Excerpt from the Horizon Manual.............................DTIHM003
-
- AMS Memory Expansion Card.
- by Bruce Harrison...........................................DTIHM004
-
- Corcomp Memory Expansion Card.
- by Jeff White...............................................DTIHM005
-
- Western Horizon Technology AT Keyboard Interface.
- by Don O'Neil...............................................DTIHM006
- by David Nieters............................................DTIHM007
-
- MBP - Clock A/D&D/A.
- by Dan H. Eicher............................................DTIHM008
-
- Super Space.
- from Information found in Micropendium......................DTIHM009
-
- Super Space II Cartridge.
- from Original Documentation - Thanks to David Ormand........DTIHM010
-
- Internals of the DEC command.
- by Jeff White...............................................DTIHM011
-
- 99/4a clock speeds and assembly timing.
- by Jeff White...............................................DTIHM012
-
- The TMS9985.
- by Dan Eicher...............................................DTIHM013
-
- The TMS99105A.
- by Dan Eicher...............................................DTIHM014
-
- Bugs in the console interupt routine.
- by Jeff White...............................................DTIHM015
-
- Setting up user interupt routines.
- by Jeff White...............................................DTIHM016
-
- Interupts
- by Jim Ness.................................................DTIHM017
-
- RS232 Circular Interupt Buffer.
- by Texas Instruments........................................DTIHM018
-
- Corcomp RS232 & PIO internals.
- by Jeff White...............................................DTIHM019
-
- Bringing your Myarc RS232 into the 90's
- by Jeff White and Dan Eicher................................DTIHM020
-
- A definition of skew.
- by Jeff White...............................................DTIHM021
-
- 3.5" Drives and the Geneve.
- by Jeff White...............................................DTIHM022
-
- Disk Controllers -- an Addendum March, 1987
- by Jerry Coffey.............................................DTIHM023
-
- A Hard Drive Odessey (Oddity)
- By Dan H. Eicher and Jeffrey H. White.......................DTIHM024
-
- The 9224: A failed experiment or an educational experience?
- by Dan H. Eicher and Jeffrey H. White.......................DTIHM025
-
- Fixing Blown Bit Maps on the HFDC
- by Edward Hallett...........................................DTIHM026
-
- VDPID & CPUID
- by Jeff White...............................................DTIHM027
-
- An Explination of Bit Map Mode
- by Jeff White...............................................DTIHM028
-
- Graphics 4 Mode Tutorial
- by David Nieters............................................DTIHM029
-
- In search of.... Leading Edge Connectors.
- by Dan H. Eicher............................................DTIHM030
-
- Modify the Rave Speech Card and MBP Card for use with the Geneve.
- by Beery Miller.............................................DTIHM031
-
- Pin definition for the new Rave expansion box.
- re-typed by Dan Eicher......................................DTIHM032
-
- TI-99/4 - THE EARLY DAYS
- by Herbert H. Taylor.......................................DTIHM033
-
- 9900,9901,9902,9904 by Definitions
- by Dan Eicher...............................................DTIHM034
-
- Console Connectors
- by Thierry Norspikel........................................DTIHM035
-
- How to adapt Atari joystick to work on the TI.
- Author Unknown..............................................DTIHM036
-
- Grand Ram Technical Manual
- by DataBioTics & SofMachine Inc.............................DTIHM037
-
- Myarc FDC Technical Information/Manual
- by Paolo Bagnaresi..........................................DTIHM038
-
- DX-10 OPCODES AND MNEMONICS
- by Texas Instruments Inc....................................DTIHM039
-
- =============================================================================
- DTIHM001
-
-
- Accessing Extra Memory on the Myarc Memory Expansion Card.
-
- From the Myarc Memory Expansion Manual....
-
- To access the additional 96K or RAM (in addition to the standard 32K) with
- assembly language, the following is a useful discussion on its operation.
-
- The 128K RAM is divided into 4 banks of 32K each. When enabled, each bank
- occupies memory locations >2000->3FFF and >A000-FFFF. The mechanism to select a
- particular memory bank is determined by CRU bits >1002 and >1004. When these
- bits are zero, the normal 32K memory expansion is enabled. The other 3 banks are
- selected by setting the proper combination of bits. The following examples show
- how to select each of the four memory banks from assembly language excuting from
- "PAD" RAM:
-
- Select Bank 2 Select Bank 4
- LI R12,>1000 LI R12,>1000
- SBO 1 SBO 1
- SBZ 2 SBO 2
-
- Select Bank 3 Select "Standard 32K Ram"
- LI R12,>1000 LI R12,>1000
- SBZ 1 SBZ 1
- SBO 2 SBZ 2
-
- Note: 512K card uses the additional CRU bits >1006 and >1008 to access
- the additional banks.
-
- LI R12,>1000
- SBZ 1 \
- SBZ 2 \ This would select the Standard 32K Ram Memory.
- SBZ 3 /
- SBZ 4 /
-
- Note: These cards respond at >1000 + >1900!
-
- A simpler way to page the Myarc memory cards is with LDCR instructions.
- Here are a few examples:
-
- BANK1 BYTE 0
- BANK2 BYTE 1
- BANK3 BYTE 2
- BANK4 BYTE 3
- BANK5 BYTE 4
- ... (assign byte values 5 thru 12 to BANK6 thru BANK13)
- BANK14 BYTE 13
- BANK15 BYTE 14
- BANK16 BYTE 15
-
- Select Bank 1 Select Bank 13 Page through banks
- LI R12,>1000 LI R12,>1000 LI R12,>1000
- LDCR @BANK1,4 MOVB @BANK13,R1 LI R1,BANK1
- LDCR R1,4 LI R2,16
- NB LDCR *R1+,4
- Page backward all banks DEC R2
- LI R12,>1000 JNE NB
- LI R1,BANK15
- PB LDCR R1,4
- JEQ FI
- DEC R1
- JMP PB
- FI ... (next instruction)
-
- =============================================================================
- DTIHM002
-
- Foundation 128K Card
-
- The Myarc Memory Expansion card is almost identical to the Foundation card,
- the only real difference is the CRU address for banking. These two cards
- are so close that Travis Watford produced an article on how you could upgrade a
- Foundation 128K Card to 512K and make it so that it could accept a Myarc 512K
- DSR eprom.
-
- It should be noted, orginally the Foundation came with NO DSR eprom and was
- strictly usable as memory expansion.
-
-
- CRU ADDRESS
-
- Select Bank 2 Select Bank 4
- LI R12,>1E00 LI R12,>1E00
- SBO 1 SBO 1
- SBZ 2 SBO 2
-
- Select Bank 3 Select "Standard 32K Ram"
- LI R12,>1E00 LI R12,>1E00
- SBZ 1 SBZ 1
- SBO 2 SBZ 2
-
- ==============================================================================
- DTIHM003
-
- From the Rambo/Horizon User Operating Manual
-
-
- Rambo
-
- This section of the manual will try to explain the memory managment sub-program
- called >B0 and how to interface with it using assembly code. This low-level
- sub-program will only work on Horizon cards with the RAMBO hardware installed.
- If you need more help on using the sub-program see section 5.6 of this manual.
-
- The orginal Horizon hardware only allowed the Horizon memory to be accessed in
- 2K blocks at the DSR space from >5800 thru >5fff. The rest of the DSR space from
- >4000 thru >57ff was reserved for the Horizon ROS. This limited access to the
- memory on the Horizon card was fine for uses like a ramdisk, but to write a
- program which really executed from and used the Horizon memory was almost
- impossible. There needed to be a new way of accessing the Horizon memory, but
- without losing the wonderful and powerful ramdisk features and functions. With
- this in mine, we decided to design a simple upgrade kit for all Horizon cards
- which would allow the upgraded Horizon to work the same in the original Horizon
- mode; but when accessed thru a new mode it would switch to a whole new paging
- system which would be better designed for writing large programs, etc. The ROS
- would also have to be upgraded to support the new mode by adding a super memory
- management sub-program to ease in the writing of large programs as well as
- allowing both ramdisk files and program space to share the same memory.
-
- Finally, with the RAMBO hardware and the SERIES 8 software, it was now possible
- to write large programs or programs which used the RAMBO program space for DATA
- storage very easily. The SERIES 8 software added a sub-program called >B0 to
- handle the complex memory management needed to make sure all programs run
- perfectly without destroying any files or other programs which may be sharing
- the memory on-board the Horizon card.
-
- All the values for the sub-program >B0 are transfered thru CPU PAD addresses,
- which will be explained later on. Access to the sub-program >B0 is similar to
- the normal DSRLNK type >8 which is for DSR devices like "DSK1.", and "RS232.";
- except the DSR only needs a 2 byte VDP PAB of >01B0, the first byte being the
- length, and the second byte being the sub-program name >B0. The following
- section is divided into five different parts, the first two explaining the CRU
- interface bits, and the last three explaining the three different ways to access
- the sub-program >B0.
-
- ORIGINAL HORIZON CRU INTERFACE ACCESS:
-
- The orginal Horizon interface has a CRU address range from >1000 thru >1700, and
- the 8 or 16 CRU bits are defined as follows:
-
- CRU BITS | Definition fo the CRU interface bits (15=MSBit / 0=LSBit)
- -----------------------------------------------------------------------
- 0 = 6K >4000 OFF/ON (0=ROS OFF, 1=ROS ON) Ised by ROS and DSRLNK
- 1 thru 7 = 2K >5800 Page number 0 thru 127. (Max. of 256K for 8K*8 cards).
- 8 thru 9 = Select one of four banks of 256K of memory.
- (Max. of 1024 for 32K*8 cards).
- 10 thru 11 = Select one of four banks of 1024 of memory.
- (Max. of 4096K for 128K*8 cards).
- 12 thru 14 = Undefined, may be used on a future series of Horizon cards.
- 15 = Reset to 0: Used to change to RAMBO mode,
- on original Horizons it was undefined.
-
- RAMBO CRU INTERFACE ACCESS:
-
- A Horizon card with RAMBO installed can work the same as an original Horizon as
- detailed above or when bit 15 or the CRU interface is set to 1, it can be
- accessed as follows:
-
-
-
- CRU BITS | Definition fo the CRU interface bits (15=MSBit / 0=LSBit)
- -----------------------------------------------------------------------
- 0 = 6K >4000 OFF/ON (0=ROS OFF, 1=ROS ON) Ised by ROS and DSRLNK
- 1 thru 2 = Not used when in RAMBO mode, recommended both be reset to 0.
- 3 thru 7 = 8K >6000 Page number 0 thru 31. (Max. of 256K for 8K*8 cards).
- 8 thru 9 = Select one of four banks of 256K of memory.
- (Max. of 1024K for 32K*8 cards).
- 10 thru 11 = Select one of four banks of 1024K of memory.
- (Max. of 4096K for 128K*8 cards).
- 12 thru 14 = Undefined, may be used on a future series of Horizon cards.
- 15 = Set to 1: Used to change to original Horizon mode.
-
-
- ACCESS MODE #1 FOR SUB-PROGRAMS >B0 (Gets Max. number of free 8K pages):
-
- >834A IN Must be cleared before access to get true number of free pages.
- OUT Max. number of free 8K pages for all RAMBO's in the TI system.
- >834C IN >0000 = Gets the Max. number of free 8K pages in the system.
- OUT Not changed, will be the same value as IN.
- >8350 IN Not used for input to the sub-program >B0.
- OUT >0000 if no errors, or >FFFF if errors where detected.
-
- Accessing >B0 with >834A and > 834C cleared will, upon exit, return to the
- program in >834A the max. number of free 8K pages for all RAMBO's in the system.
- This access causes all cards to be switched to orginal Horizon mode, and being
- so can't be accessed from within the >6000 thru >7FFF space. The following is
- an assembly example which is accessed like: BL @GETMAX
-
- REF VMBW,DSRLNK Normal VMBW and DSRLNK E/A BLWP's.
- GETMAX CLR @>834A Clear Max. number of pages.
- CLR @>834C Ask for max. number of free 8K pages.
- LI R0,VDPPAB Address of the PAB in VDP memory.
- LI R1,CALLBO Address of the PAB in CPU memory.
- LI R2,2 Length of the PAB to be written to VDP memory.
- BLWP @VMBW Write the PAB (>01B0) to VDP memory.
- MOV R0,@>8356 Make >8356 point to the length byte of the
- PAB in VDP ram.
- BLWP @DSRLNK Execute the sub-program >B0.
- DATA >A
- MOV @>8350,R0 Check for errors. EQUAL BIT IS SET IF NO ERR!
- RT Return to program.
- CALLBO DATA >01B0 PAB data for sub-program >B0.
-
- ACCESS MODE #2 FOR SUB-PROGRAM >B0 (Selects an 8K page and turns on RAMBO):
-
- >834A IN Not used for input to the sub-program >B0.
- OUT CRU address of the RAMBO/HORIZON card that is currently on.
- >834C IN A page number from 1 to max. number of free 8K pages.
- OUT The 16 bit CRU value used to select the page and turn RAMBO on.
- >8350 IN Not used for input to the sub-program >B0.
- OUT >0000 if no errors, or >FFFF if errors where detected.
-
- Accessing >B0 with >834C containing the number of the page you want will turn on
- the correct RAMBO/HORIZON card and then select the page you specified, and upon
- exit will return the CRU address and CRU value used to select the page in >834A
- and >834C. This command also overrides any cartridge which may be plugged into
- the module port, and will also turn off the P-Gram card if it was on. This
- function makes sure no other device is responding at the same >6000 space of
- memory. The following is an assembly example which is accessed like: BL @SETPAG
- with the next line containing a line of DATA with the number of the page you
- want.
-
- REF VMBW,DSKLNK Normal VMBW and DSRLNK E/A BLWP's
- SETPAG MOV *R11+,@>834C Get number of the page to select.
- LI R0,VDPPAB Address of the PAB in VDP memory.
- LI R1,CALLBO Address of the PAB in CPU memory.
- LI R2,2 Length of the PAB to be written to VDP memory.
- BLWP @VMBW Write the PAB (>01B0) to VDP memory.
- MOV R0,@>8356 Make >8356 point to the length byte of the
- PAB in VDP.
- BLWP @DSRLNK Execute the sub-program >B0.
- DATA >A
- MOV @>8350,R0 Check for errors. EQUAL BIT IS SET IF NO ERR!
- RT
- CALLBO DATA >01B0 PAB data for sub-program >B0.
-
- ACCESS MODE #3 FOR SUB-PROGRAM >B0 (Turns off all RAMBO/HORIZON cards):
-
- >834A IN Not used for input to the sub-program >B0.
- OUT Not changed will be the same value as IN.
- >834C IN >FFFF = Tell all cards to switch back to original Horizon mode.
- OUT Not changed, will be the same value as IN.
- >8350 IN Not used for input to the sub-program >B0.
- OUT >0000 if no errors, or >FFFF if errors where detected.
-
- Accessing >B0 with >834C containing >FFFF will tell all the Horizon cards in
- your computer system to switch back to original Horizon mode. This call, since
- it will remove any page at >6000, can't be accessed from the >6000 space. If for
- some reason a RAMBO program doesn't switch all the cards back to original
- Horizon mode, the ROS will do a complete reset any time the TI Title Screen
- appears. The previous assembly examples should be enough to firure out how to use
- this mode of sub-program >B0.
-
-
- ==============================================================================
- DTIHM004
-
- The AMS Memory Expansion Card.
-
- AN ADVENTURE WITH AMS
- FROM TWO VIEWPOINTS
- By Bruce Harrison & Lew King
-
- People are buying the Advanced Memory System (AMS) now that
- it's being produced and sold by the SW99ers of Tucson, AZ. One
- of those customers is Lew King, from Industry PA, who's
- co-authoring this article. His perspective as an owner will
- follow, but for the moment it's the viewpoint of an experienced
- Assembly programmer.
-
- There are two potential kinds of applications for the AMS
- memory card. One is the creation of massive programs, in which
- the code to operate the program needs more than 32K of RAM.
- That's not the forte of this particular Assembly programmer.
- The second kind of application is one in which the program
- itself occupies only part of the 32K memory, but the program
- needs large blocks of memory to handle data. For example, you
- might have a word processor like Funnelweb where the text buffer
- could be expanded to perhaps 16 times what Funnelweb could
- normally handle. Now that's the kind of application that gets
- Bruce Harrison's attention.
-
- At the M.U.G. in Cleveland, Lew King bought his AMS card,
- with 256K capacity. When I asked what he'd do with all that
- memory, he quickly came up with an idea for me to pursue. Some
- time back, I produced my Video Titler program, which uses Bit
- Map images. Just one such image (for example a TI-Artist
- picture with color included) occupies 12K bytes of memory. Two
- such images completely fill the high portion of the 32K memory.
-
- Thus in the original Video Titler, the program code and
- internal data had to fit entirely in low memory, starting at
- >2678, so that all of high memory from >A000 thru >FFFF could be
- used to store two complete bit-map color pictures. That meant
- that after just one "wipe" transition, the user would have to
- pause the VCR, load the next frame from disk, then proceed to
- the next transition. That works, but it's labor intensive and
- slow work for the user. Lew immediately saw the possibility for
- pre-loading many frames into the AMS, so that pauses for re-load
- from disk would be minimized.
-
- Having this idea to work with was of course just the start.
- To make a working program, we had to have some definitive words
- on how to take advantage of the AMS in terms of Assembly Source.
- Nobody at the Cleveland gathering had that kind of information
- at his fingertips. There is no published source (until now) for
- that kind of information. After a couple of unsuccessful
- attempts to get the needed information, I asked Lew to print out
- and send me the "docs" that were delivered on disk with his AMS
- card. Lew complied, and within two days I had printed docs plus
- several disks. As it turned out, it was fortunate indeed that
- Lew included those disks, because one of them contained a source
- file called AMSINI. That sounded like it could be important,
- and it was. AMSINI contained the key source code segments to
- make use of the card. There was still a problem, however, in
- that some of the material in the printed docs contradicted parts
- of the AMSINI source file.
-
- After working through a chain of informants, I got in touch
- with Rich Gilbertson, who was making a version of his RXB
- product for the AMS card. Rich filled in the gaps, telling me
- that the printed docs were wrong and the AMSINI file correct.
- He pointed out all the non-obvious things, like the fact that in
- its power-up condition certain pages of the AMS are pre-assigned
- to the low and high portions of 32K memory. Pages 2 and 3 are
- the low memory, and pages 10 (>A) through 15 (>F) are assigned
- as the high memory. In other words, if your program loads in
- low memory, it will reside in pages 2 and 3 of the AMS, and if
- it writes to or reads from high memory, that will go into and
- come from pages >A through >F of the AMS. (One page is 4K of
- memory. Pages >A through >F will hold 24K bytes.)
-
- Among other things, this means that pages 0 and 1 and the
- group of pages from 4 through 9 are unused in the power-up
- configuration. Pages beyond 16 (>10) are also unfilled on
- power-up. Some programmers (including Rich Gilbertson) prefer
- to leave pages below 16 (>10) unused, reserving them for future
- use with an alternate operating system. Being an old curmudgeon
- who doesn't believe any such operating system will ever emerge,
- I decided that pages below 16 would not be left alone by my
- Video Titler program.
-
- But first, since AMS cards come in various configurations,
- with capacities of 128K, 256K, and even 512K, I had to have a
- way for my program to measure the amount of memory that was
- present, and adapt its operation accordingly. Fortunately, that
- AMSINI file on the disk contained just such a program segment.
- I adapted that slightly, so it would measure page by page
- starting at 16 and going to whatever was the highest page
- available. Since pictures occupy three pages each, I divide the
- number found by three to find the number of "frames" that can be
- stored in the memory above page 15. In the Video Titler case,
- we can use pages 10 thru 15 to store two more frames, since the
- entire program remains in low memory, pages 2 and 3. Now let's
- suppose we've got a card with only 128K memory. There will be
- only 16 pages above 15, and using them in groups of 3 will mean
- only 5 frames there. Adding the two frames in pages 10 thru 15
- means seven frames can be stored. If we use that unused space
- from page 4 thru 9, two more frames can be stowed, for a total
- of nine. Thus in the program we take the number of pages beyond
- 15, divide that by three (ignoring any remainder) and add 4 to
- come up with the total number of frames we can keep in memory.
- For Lew King's card, with 256K capacity, there are 48 pages past
- 15, so a total of 20 frames can be stored. For 512K capacity, a
- whopping 41 frames could be put into memory.
-
- In the sidebar for this article are a couple of "snippets"
- of source code that may be helpful to anyone trying to make use
- of the AMS card for data-intensive applications. First in that
- is a "complete program" section called AMST. This was the first
- thing I sent to Lew King for testing. This little program, if
- run on my own machine, which has no AMS card, will simply report
- that fact. On Lew's machine, it reports 48 Pages and 20 Frames
- as the capacity of his AMS card.
-
- This source can be modified easily to report in different
- ways. For example, you could take the number of pages above 15,
- add 12 for the pages from 4 thru 15, then multiply by 4 to
- indicate available capacity in KiloBytes.
-
- ACCESS and MAPPING
-
- To use other than the default setup, you have to do two
- things. First, you have to "turn on" the card's memory in the
- >4000 block and write to the mapping registers there. Second,
- you have to "turn on" the mapper function to make what you've
- written into the >4000 block take effect. The first step in all
- this is to set Register 12 to the value >1E00, which is the CRU
- address of the AMS card. Now doing a SBO 0 instruction will
- enable the >4000 memory block for reading and writing. In that
- block, each word starting with >4000 and ending with >401E acts
- to control what page maps into what memory location. The
- subroutine AMSINI (see sidebar) initializes all the mapping
- registers to power-up condition. Thus, for example, >4004 is
- set for page 2, >4006 to page 3, etc. In our own program, we're
- mapping things into the >A000 through >F000 blocks. Thus the
- registers we write to in >4000 are at >4014 thru >401E. To make
- a mapping selection, we write the desired page number to the
- high order byte of the control register. Let's take a concrete
- example. Suppose we want pages 4, 5 and 6 of the AMS to behave
- as if they were at >A000, >B000, and >C000. It's this easy:
-
- LI R12,>1E00 CRU ADDRESS
- SBO 0 TURN ON CARD'S >4000 BLOCK
- LI R1,>0400 PAGE NUMBER IN LEFT BYTE
- LI R3,>4014 MAPPING REGISTER FOR >A000 BLOCK
- MOV R1,*R3+ WRITE TO >4014 AND ADD 2 TO R3
- AI R1,>100 LEFT BYTE OF R1=5
- MOV R1,*R3+ WRITE 5 TO >4016 AND ADD 2 TO R3
- AI R1,>100 LEFT BYTE OF R1=6
- MOV R1,*R3 WRITE 6 TO LEFT BYTE AT >4018
-
- This sets the registers, but does not actually start the
- mapper working. To put the mapping in effect, we have to
- perform one more operation:
-
- SBO 1 TURN ON THE MAPPER
-
- Now that the mapper is turned on, anything written to >A000
- thru >CFFF will actually be written into pages 4 thru 6 of the
- AMS memory instead of into pages >A thru >C. Similarly, any
- memory reading from >A000 thru >CFFF will actually read the
- contents of pages 4 thru 6 of the AMS memory. Thus your program
- can write and read as if to >A000 thru >CFFF, but the mapper
- will make things actually access the pages 4 thru 6 in the AMS
- card. You can turn off access to the card's >4000 block and
- still leave the mapper in effect by the instruction SBZ 0.
- (Provided R12 still contains >1E00.) You can turn off the
- mapper by SBZ 1, and then the areas >A000 thru >CFFF will revert
- to "normal", reading and writing to pages >A thru >C of the AMS
- card.
-
- In the finished AMS version of Video Titler, the program
- works by frames, where each frame accounts for three pages of
- the AMS memory. We use an odd-even scheme, so that odd numbered
- frames (1,3,5,...19) go into pages mapped to >A000 thru >CFFF,
- and even numbered ones go into pages mapped to >D000 thru >FFFF.
- This way the program always has immediate access to two frames
- at any given time. Let's say for example that the user asks to
- load a TI-Artist picture (with color) into Frame 1. We take the
- desired frame number, multiply that by three, add one, then put
- that in the left byte of a workspace register. Since this is an
- odd frame, we use the mapping registers at >4014 thru >4018, and
- put 4, 5, and 6 into the left bytes of those mapping registers,
- respectively. (For an even page, we'd use >401A thru >401E.)
- Now when the program reads the file, it dumps the contents of
- the pattern and color parts into >A000 thru >CFFF, which really
- goes into pages 4 thru 6 of the AMS memory. In similar fashion,
- frame 2 goes into pages 7 thru 9, frame 3 into pages 10 thru 12,
- frame 4 goes to pages 13 thru 15, and so on until frame 20,
- which goes into pages 61 thru 63. Clear as mud? Look at Part
- Two of the Sidebar, which may help. Meanwhile, how about a
- little different perspective?
-
- The AMS Owner's Viewpoint
-
- The Super AMS card is a most welcome and needed addition to
- the TI 99/4A. The physical aspects are a well-made, high-quality
- card which inserts in place of the 32K card. In normal use, it
- duplicates the 32K card exactly, except for the absence of an
- indicator light. In expanded mode, the card provides from 128K
- to 1 meg of paged memory, depending on the chips installed.
-
- There are three disks of software provided with the card,
- of which two are archived. Included is an excellent memory
- tester that writes and reads to every bit. This assures the
- user that everything is functioning properly. Also included is
- an excellent disk copy program, AMS Copy. The program reads an
- entire 720 sector disk into memory, then writes to the copy disk
- in one pass. Contents of the master disk remain in memory,
- allowing as many copies to be made as needed without re-reading.
- Also there were two games, which I could not get to run. The
- remainder of the software is mainly for programmers and of
- little consequence for the end user. So, aside from testing the
- memory and copying disks, what can be done with the Super AMS
- card? Well, prior to the middle of July, the answer was "not too
- much."
- Enter Bruce Harrison. When I first purchased the Super AMS
- card back in May at Cleveland, Bruce rather poo-pooed it,
- saying that he could write any program for the TI and keep it
- well within the 32K space. No argument here. Then I posed the
- hypothetical question....how many titles could the Video Titler
- program hold in 256K of memory? To which Bruce answered, "I'll
- think about it."
-
- Well, Bruce did a lot of thinking and a lot of programming.
- The result.... the Video Titler can now hold up to twenty color
- graphic files in memory on a 256K card. Super. They are
- instantly available using any of the many different wipes in the
- program. If you make a mistake, or change your mind, any frame
- can be reloaded without changing the others. The sequence can
- also be started at any frame. Anyone who has previously used
- the Video Titler will most certainly appreciate the new
- features, added versatility, speed, and power of the new AMS
- Video Titler. The entire operation of paging twenty titles into
- memory, then using them is totally seamless and transparent to
- the user. It is as though the TMS9900 had twenty address lines.
- Substantial documentation is included with the program, but I
- dare say that most folks won't read them. Aside from possibly
- looking up which keys to use for what wipes, the Titler is that
- easy to use. When you are ready to quit, the Titler returns
- nicely to the E/A menu screen.
-
- It's rather ironic.... To the best of my knowledge, Bruce
- Harrison is the first programmer outside of the SAMS development
- team to make any real productive software for the Super AMS
- card. Yet, he is the one programmer that never received a card
- to use. The AMS Video Titler beta copy worked flawlessly the
- very first time. This is a real tribute to outstanding
- programming ability.
-
- Programmer's Update
-
- Since the above was written, I have received a set of the
- AMS documentation and an offer of a card from David Ormand of
- the SW99ers. David has been sent a copy of the AMS Video Titler
- and a letter accepting the offer of a card to use for
- programming and testing my new products designed for use with
- AMS.
-
- * SIDEBAR PART ONE - A TEST PROGRAM
- * COMPLETE AS SHOWN
- *
- * TEST PROGRAM FOR AMS CARD
- * SPECIAL BY B. HARRISON
- * FOR TITLER AMS VERSION
- * AMST/S
- REF KSCAN,VMBW
- DEF START
- KEYADR EQU >8374 Key-unit address
- KEYVAL EQU >8375 Reported keystroke
- STATUS EQU >837C GPL STATUS BYTE
- GPLWS EQU >83E0 GPL workspace
- GR4 EQU GPLWS+8 GPL Reg 4
- GR6 EQU GPLWS+12 GPL Reg 6
- STKPNT EQU >8373 stack pointer
- LDGADD EQU >60 load grom address address
- XTAB27 EQU >200E a storage location
- GETSTK EQU >166C get stack
-
- START LWPI WS LOAD OUR WORKSPACE
- BL @AMSINI USE AMS INITIALIZE SUBROUTINE (BELOW)
- C R1,@>401E AMS CARD PRESENT? 0=NO 401E=0F0F=YES
- JNE NOAMS IF NO AMS CARD, JUMP AHEAD
- SBO 1 TURN ON MAPPER
- CLR R1 R1=0
- CLR R4 R4=0
- MOV R1,@>401E SET >F000 TO PAGE >00
- MOV R1,@>F000 SET FIRST WORD PAGE 0 TO 0
- LI R3,>8000 R3 TO PAGE >80
- MOV R3,@>401A SET >D000 TO PAGE >80
- LI R1,>0F00 START AT PAGE 15
- AMSLP1 AI R1,>100 ADD ONE PAGE
- INC R4 INC NUMBER FOUND
- MOV R1,@>401C SET >E000 TO PAGE 16, 17, 18, ETC.
- MOV R1,@>E000 LOAD >E000 WITH PAGE #
- C R1,@>E000 DID IT LOAD?
- JNE AMSDO IF NOT, WE'RE BEYOND LAST PAGE
- C @>F000,@>E000 CHECK PAGE 0 FOR CHANGE
- JEQ AMSDO IF EQUAL, JUMP
- CI R1,>9000 LIMIT NUMBER?
- JL AMSLP1 IF LESS, REPEAT
- C @>D000,@>E000 CHECK PAGE 80 FOR CHANGE
- JNE AMSLP1 IF NOT EQUAL, REPEAT
- AMSDO DEC R4 ONE LESS (R4 EQUALLED PAGE NOT FOUND)
- MOV R4,@AMS SAVE NUMBER OF PAGES ABOVE 15
- BL @AMSINI AMS INITIALIZE (BACK TO "NORMAL")
- SBZ 0 TURN OFF CARD - MAPPER STILL ON
- SBZ 1 TURN OFF MAPPER
- JMP REPORT JUMP TO REPORT SECTION
- NOAMS LI R0,11*32+3 ROW 12, COL 4
- LI R1,NOSTR NO AMS MESSAGE
- BL @DISSTR DISPLAY THAT
- JMP KEYEX JUMP TO EXIT ROUTINE
- REPORT LI R0,10*32+3 ROW 11, COL 4
- LI R1,PGSTR PAGES STRING
- BL @DISSTR DISPLAY THAT
- A R2,R0 ADD LENGTH TO POINTER
- MOV @AMS,R3 GET NUMBER OF PAGES PAST 15
- MOV R3,@>835E PUT AT >835E
- BL @SHWINT SHOW NUMBER ON SCREEN
- LI R0,12*32+3 ROW 13, COL 4
- LI R1,FRMSTR FRAMES STRING
- BL @DISSTR SHOW THAT
- A R2,R0 ADD LENGTH
- CLR R2 CLEAR R2
- LI R1,3 SET R1 TO 3
- DIV R1,R2 DIVIDE R2-R3 BY 3
- AI R2,4 ADD 4 FOR PAGES 4 THRU 15
- MOV R2,@>835E QUOTIENT PLUS 4 (FRAMES) TO >835E
- BL @SHWINT SHOW THAT NUMBER (1/3 OF PAGES NUM + 4= FRAMES)
- KEYEX BLWP @KSCAN SCAN KEYBOARD
- LIMI 2 ALLOW INTS
- LIMI 0 STOP INTS
- CB @ANYKEY,@STATUS KEY STRUCK?
- JNE KEYEX IF NOT, REPEAT
- LWPI GPLWS LOAD GPL WORKSPACE
- B @>6A BACK TO GPL INTERPRETER
- *
- * SUBROUTINES SECTION
- *
- * AMSINI SETS AMS CARD TO "POWER-UP" CONDITION
- *
- AMSINI LI R12,>1E00 AMS CRU BASE
- SBO 0 TURN ON AMS
- LI R1,>FEFF (THIS IS ->0101)
- LI R0,>4000 START OF MEMORY
- AMSLP AI R1,>0101 ADD 1 PAGE
- MOV R1,*R0+ MOVE 2 BYTES TO MEM-MAPPER
- CI R0,>4020 ALL DONE?
- JLT AMSLP NO, INIT MORE
- RT RETURN
- *
- * DISSTR DISPLAYS STRING POINTED BY R1 AT SCREEN
- * LOCATION POINTED TO BY R0
- *
- DISSTR MOVB *R1+,R2 LENGTH BYTE TO R2
- JEQ DISX IF ZERO, SKIPIT
- SRL R2,8 RT JUST
- BLWP @VMBW WRITE STRING TO SCREEN
- A R2,R1 ADD LENGTH TO POINTER
- DISX RT
- *
- * FOR SHWINT, FIRST PUT INTEGER AT >835E,
- * AND POINT R0 AT DESIRED LOCATION
- * THEN BL @SHWINT
- *
- SHWINT BLWP @GPLLNK USE GPLLNK VECTOR
- DATA >2F7C DATA FOR INT TO STRING
- MOVB @>8361,R2 LENGTH TO R2
- SRL R2,8 RT JUST.
- MOVB @>8367,R1 ADDR TO R1
- SRL R1,8 RT JUST
- AI R1,>8300 ADD OFFSET
- BLWP @VMBW WRITE STRING
- RT
- * GENERAL PURPOSE GPL LINK
- * by Doug Warren/Craig Miller
- *
- GPLLNK DATA GLNKWS
- DATA GLINK1
- RTNAD DATA XMLRTN
- GXMLAD DATA >176C
- DATA >50
- GLNKWS EQU $->18
- BSS >08
- GLINK1 MOV *R11,@GR4
- MOV *R14+,@GR6
- MOV @XTAB27,R12
- MOV R9,@XTAB27
- LWPI GPLWS
- BL *R4
- MOV @GXMLAD,@>8302(R4)
- INCT @STKPNT
- B @LDGADD
- XMLRTN MOV @GETSTK,R4
- BL *R4
- LWPI GLNKWS
- MOV R12,@XTAB27
- RTWP
- *
- * DATA SECTION
- *
- WS BSS 32 OUR REGISTERS
- AMS DATA 0 PAGES BEYOND 15
- NOSTR BYTE 19
- TEXT 'NO AMS CARD PRESENT'
- PGSTR BYTE 14
- TEXT 'PAGES FOUND = '
- FRMSTR BYTE 9
- TEXT 'FRAMES = '
- ANYKEY BYTE >20
- END
- *
- * END OF COMPLETE PROGRAM
- *
- * PART TWO OF SIDEBAR - A "SNIPPET"
- *
- * SUBROUTINE SETFRM (FROM AMS VIDEO TITLER)
- * ON ENTRY, R3 CONTAINS THE CURRENT FRAME NUMBER (1 THRU XX)
- * WHERE XX CAN BE 9 (128K CARD), 20 (256K CARD), OR 41 (512K CARD)
- * PAGE NUMBERS START WITH 0, SO FOR EXAMPLE ON A 256K CARD, PAGES
- * ARE NUMBERS 0 THRU 63, FOR A TOTAL OF 64 PAGES
- *
- * THE PROGRAM "KNOWS" HOW MANY FRAMES ARE AVAILABLE, AND
- * WON'T USE THIS SUBROUTINE BEYOND THE AVAILABLE FRAMES.
- *
- SETFRM MOV R3,R1 COPY CURRENT FRAME # TO R1
- MPY @THREE,R3 MULTIPLY R3 BY 3
- INC R4 ADD 1 TO PRODUCT IN R4 (PAGE NUMBER ON AMS = 4 THRU YY)
- * YY IS THE HIGHEST PAGE -2
- SWPB R4 SWAP TO LEFT BYTE
- COC @ONEWD,R1 CHECK CURRENT FRAME FOR ODD/EVEN
- JNE SETEVN IF NOT 1 IN LSB, EVEN
- SETODD LI R8,>4014 MAP FOR >A000
- LI R1,>A000 SET R1=>A000
- JMP SETPGS JUMP
- SETEVN LI R8,>401A MAP FOR >D000
- LI R1,>D000 SET R1=>D000
- SETPGS LI R12,>1E00 AMS CRU ADDR
- SBO 0 TURN ON CARD
- SBO 1 TURN ON MAPPER
- LI R5,3 THREE WRITES TO MAKE (3 PAGES PER FRAME)
- SETLP MOV R4,*R8+ SET CURRENT PAGE AND INCT R8
- AI R4,>100 NEXT PAGE
- DEC R5 DEC COUNT
- JNE SETLP RPT IF NOT 0
- SBZ 0 TURN OFF CARD MEMORY (>4000)
- * THE MAPPER STAYS ON
- RT RETURN
- * UPON RETURN, R1 IS USED TO DETERMINE WHERE THE FRAME IS SENT OR GOTTEN FROM
- * DEPENDING WHETHER WE'RE WRITING OR READING A FRAME
- *
- * END OF PART 2 OF SIDEBAR
-
- ============================================================================
- DTIHM005
-
- Corcomp Memory Expansion Unit.
-
- This device uses a TMS4500 for Memory Refresh. (There is no 9901 on the
- card as a previous version of this documented stated.)
-
- CRU Bit Purpose
- 0 DSR Rom Enable
- 1 Ram Disable
- 2 Bank 0
- 3 Second 256K
- 4 Rom Page
- 6 Bank 1 \
- 10 Bank 2 \
- 14 Bank 3 \ Pages
- 18 Bank 4 /
- 22 Bank 5 /
- 26 Bank 6 /
- 30 Bank 7 /
- 32 Reset=1
-
- Each bank fills the entire 32K area (>2000-3FFF,>A000-FFFF). Only one of
- the CRU bank bits should be active (=1) at any given time. CRU bit 1 will
- disable all the RAM on the memory card. By disabling the RAM, Corcomp was
- able to support a second memory card.
-
- The design of the Corcomp memory prevents most track copiers from working.
- This is undoubtedly because the Corcomp memory affects the bus timing.
-
- ==========================================================================
- DTIHM006
-
- WHT Keyboard Interface
-
- Specifications for TI 99/4a AT Keyboard interface and ROM upgrade
- Copyright 1993-96 Western Horizon Technologies
-
- CRU DEFINITIONS:
-
- CRU Base: >0400
-
- System Occupies >0000 to >03FF due to partial decode of 9901.
-
- Output Bits:
-
- 0 1=Turn On 8251A USART at base address >4000
- 1 1=Disable ROM/RAM on card, 0=ENABLE (enabled at power up)
- 2 1=RAM in >0000 to >2000 space, 0=EPROM (EPROM on power up)
- 3 spare - NOT Connected
- 4 Enable 8251A character in receive buffer interrupt to system
- 5 8251A RESET
- 6 1=Set system RESET line*
- (Causes a hardware reset to occur, should be activated by a
- CTL-ALT-DEL)
- 7 1=Cause a NMI*
- (LOAD Interrupt, should be activated by a SHIFT-PRINT SCREEN)
- 8 EPROM Extended address bit 0 (LSB)
- 9 EPROM Extended address bit 1
- 10 EPROM Extended address bit 2 (MSB)
- 11 EPROM Extended address bit 3 (Spare)
- 12 SRAM Extended address bit 0 (LSB)
- 13 SRAM Extended address bit 1
- 14 SRAM Extended address bit 2 (MSB)
- 15 SRAM Extended address bit 3 (Spare)
-
- Input Bits:
-
- Bit 0-3 Dip Switch Positions 1-4 If switch is OFF, Bit=1
- Bit 4 8251A Sync/Break detect
- Bit 5 8251A Transmitter ready, 8251A is ready to accept data
- Bit 6 8251A Transmitter empty, 8251A Has sent data if=1
- Bit 7 Character in 8251A receive buffer
-
- REGISTER DEFINITIONS:
-
- Registers at >4000 and >4002 only available when CRU BIT 0 is TRUE
-
- Registers at >8000 and >8002 are always available.
- This is the location of the memory mapper registers
- on the Myarc Geneve 9640.
-
- Registers are only partially decoded to a 128 word block.
- They physically occupy the >4000->4100 and >8000->8100 areas.
-
- PAD RAM begins at >8300
-
- Read Registers
-
- >4000
- OR 8251A Data from serial bus
- >8000
-
- >4002
- OR 8251A Status Register
- >8002
-
- Write Registers
-
- >4000
- OR 8251A Send data
- >8000
-
- >4002
- OR 8251A Control Register
- >8002
-
- * Not supported on initial board revision
-
- ===========================================================================
- DTIHM007
-
- More on the WHT Keyboard Interface:
-
- I can get you the information on accessing the memory in the WHT keyboard.
- It is all done with CRU instructions.
-
- The base CRU address for the AT keyboard interface is located at >400.
- The memory is banked in at addresses 0000-1FFF (8K) and replaces
- the console ROM.
-
- You can swap between EPROM and optional RAM on the interface by setting
- bit 2. Setting this bit to 0 selects the EPROM. Setting this bit to
- 1 selects the optional RAM.
-
- There are 8 banks of ROM and 8 banks of RAM. The bank selection is
- controlled by bits 12-15 for RAM and 8-11 for ROM. You may notice that
- there are more bits than are needed to select 8 banks. Don O'Neil left
- room for future expansion to double the amount of memory on the card.
-
- Anyway, lets say you want to select bank 2 of the RAM. Your code
- would look something like this -
-
- LI R12,>400
- SBZ 2 Turn on the RAM
- LI R12,>400+24
- LI R1,>0200 Select RAM bank
- LDCR R1,4
-
- When you are done, you want to enable bank 0 of the EPROM again
-
- LI R12,>400
- SBO 2 Turn on EPROM
- LI R12,>400+16
- CLR R1 Select ROM bank 0
- LDCR R1,4
- --
- David Nieters Dave.Nieters@dtc.fingerhut.com
- Fingerhut Companies
-
- ==============================================================================
- DTIHM008
-
- Using the MBP
-
- This MBP is a memory mapped device. It maps into the 1K Block that is reserved
- for sound >8400->87FF. It uses National Semiconductor ADC&Real Time clock.
-
- ONLY EVEN NUMBERED ADDRESSES ARE USED!!
-
- The clock and date Function.
-
- Basic Address Assembler EQU Definition
- -31168 >8640 Thousands Sec
- - 66 >8642 Tens & Hund Sec.
- - 64 >8644 Seconds
- - 62 >8646 Minutes
- - 60 >8648 Hours
- - 58 >864A Day of Week
- - 56 >864C Date
- - 54 >864E Month
-
- With a Geneve in GPL mode you can access the clock and date function at the
- same addresses. In either GPL or MDOS mode, you can map physical page >BC
- to any logical page and access the clock and date function at offset >0640
- in the 8K page.
-
- ==============================================================================
- DTIHM009
-
- Super Cartridge:
-
- This was the name of the orginal project published in Micropendium. It consisted
- of an E/A module, modified to add 8K of ram to the cartridge port - this RAM was
- backed up. In addition to giving programmers 8K of additional RAM for assembly
- code, for the first time programmers could actually create their own cartridges
- - so that with the cartridge inserted and the machine powered on, their software
- would now appear as a menu option under 1. Basic.
-
- Here is a snippet of code by David R. Romer from his July '85 article in
- Micropendium.
-
- ***************************
- * Super Cart Test Program *
- ***************************
- DEF TEST Define label TEST as program name
- AORG >6000 absolute code starting at >6000
- DATA >AA01 start of CARTRIDGE HEADER, value >AA01
- DATA >0 must be at address >6000
- DATA >0
- DATA >MNULNK pointer to first menu table entry
- DATA >0
- DATA >0
- MNULNK DATA >0 2st menu table entry, DATA 0=single entry.
- DATA ENTRY pointer to start of program
- BYTE >09 length of text to be displayed on menu scrn
- TEXT 'MENU TEST' actual menu text to be displayed
- ENTRY B @TEST branch to start of program
- ****************************
- WS BSS 32
- MASK DATA >4000
- MSG TEXT 'MENU TEST PROGRAM'
- TEST LWPI WS
- LI R0,263 scrn location for display
- LI R1,MSG pointer to text to be displayed
- LI R2,17 length of text
- BL @VMBW
- *****************************
- LI R1,>0A delay loop while text is on screen
- LOOP LI R0,>FFFF
- LOOP1 DEC R0
- JNE LOOP1
- DEC R1
- JNE LOOP
- *****************************
- LWPI >83E0 load GPL workspace
- BLWP @>0000 brach to color bar screen
- *****************************
- VMBW SOC @MASK,R0 stand alone VDP multiple byte write routine
- SWPB R0
- MOVB R0,@>8C02
- SWPB R0
- MOVB R0,@>8C02
- NOP
- WLP MOVB *R1+,@>8C00
- DEC R2
- JNE WLP
- B *R11
- END
-
- ==========================================================================
- DTIHM010
-
-
- DataBioTics Super Space II.
-
- The Super Space II takes the design of the orginal Super Cart much further by
- giving the program 32K that can be banked in 8K pages at the >6000 address
- space.
-
- I have a DataBioTics Super Space II! Two, actually! Love 'em!
-
- Banks are selected by writing a bit pattern to CRU address >0800:
-
- Bank # Value
- 0 2
- 1 8
- 2 >20
- 3 >80
-
- I don't know why this has to be a 16-bit transfer, but that's what
- the books says. The example is the following subroutine, with
- the bank number (0, 1, 2, or 3) in R0:
-
- BNKSW LI R12,>0800 Set CRU address
- LI R1,2 Load Shift Bit
- SLA R0,1 Align Bank Number
- JEQ BNKS1 Skip shift if Bank 0
- SLA R1,0 Align Shift Bit
- BNKS1 LDCR R1,0 Switch Banks
- SRL R0,1 Restore Bank Number (optional)
- RT
-
- (I'm not sure they're quite correct. I thought you couldn't
- shift R0!)
-
- But there you go!
-
- Regards,
-
- --
- *** David Ormand ************ Southwest 99ers ***
- *** dlormand@aztec.asu.edu ** Tucson, Arizona ***
- ***************************** TMS9900 Lives! ****
-
-
-
- ============================================================================-
- DTIHM011
-
- 33210 17JUL92-1918 General Information
- RE: TI CPU bug??? (Re: Msg 33209)
- From: JHWHITE To: JPLESLIE
-
- David: The DECrement instruction actually adds ">FFFF" to the value being
- decremented. The carry is set whenever the resulting value would be greater
- than >FFFF. The only time the resulting value is not greater than >FFFF is
- when the value being decremented is >0000. Some bitwise arithmetic shows what
- happens:
-
-
- DEC >8000 = b1000 0000 0000 0000
- + b1111 1111 1111 1111 = >FFFF
- --------------------
- C=1 b0111 1111 1111 1111 = >7FFF
-
- DEC >FFFF = b1111 1111 1111 1111
- + b1111 1111 1111 1111 = >FFFF
- --------------------
- C=1 b1111 1111 1111 1110 = >FFFE
-
- DEC >0000 = b0000 0000 0000 0000
- + b1111 1111 1111 1111 = >FFFF
- --------------------
- C=0 b1111 1111 1111 1111 = >FFFF
-
- Adding >FFFF, which can be thought of as -1 in two-complement form, is what
- the 9900 does when it DECrements.
-
- Jeff White
-
- p.s.: That rule for carry does not mean when the value of bit 0 changes, but
- when the addition of >FFFF to the value results in a carry value of 1 out of
- bit 0. If the value in bit 0 changing caused a status bit to change, it would
- be the OVerflow bit, not the carry bit.
-
- -*-
-
- =============================================================================
- DTIHM012
-
- 35301 22OCT92-0313 TI ECHO
- RE: clock speed? (Re: Msg 35287)
- From: JHWHITE To: ILLUSIONIST
-
- The 99/4A runs at 3 MHz with 8192 bytes ROM and 256 bytes RAM at 0 wait state,
- and the rest of memory or memory-mapped devices at 4 wait states. At 0 wait
- state, a full (16-bit) word is moved across the CPU data bus in two clock
- cycles, which makes a theoretical maximum through-put of 1.5 Mwords/sec.
- Of course, with 4 wait state memory, that takes the theoretical maximum
- through-put down to 0.5 Mwords/sec.
-
- Then take into account that the 9900 bus is only active about 25% of the
- time (because it is not pipelined like the 9995 or 99000).
-
- Jeff White
-
- -*-
- =============================================================================
- DTIHM013
-
- What's wrong with the TI-99/4(a)?
-
- It can be summed up in four words - "ninety-nine eighty five."
-
- No, this is not the price your local discount store "blew" them out
- at in 1984.....or maybe it was, but. I am referring to the TMS9985.
- This was the CPU that TI originally planned to have in the 99/4.
-
- Due to technical difficulties, the TMS9985 was never produced. That
- forced TI to use the more expensive 9900 in the 99/4, instead of the
- less expensive 9985.
-
- The TMS9985 is the father of the 9995, just as the 99000 is the
- son of the 9900. Let's review some of the highlights of the 9995.
-
- o Has an onboard cache of 256 bytes.
- o Has an 8-bit data bus.
- o Utilizes only one dedicated external interrupt level besides Reset.
-
- These are all "features" that the 9995 and 9985 share.
-
- Highlights of the 9900.
-
- o Has a 16-bit data bus to all memory.
- o Has 15 external prioritized interrupts levels besides Reset.
-
- Now, let's say for a minute you had a system designed for a TMS9985
- but you where suddenly forced to use a 9900. Most of us would go back
- to the drawing board and create a vastly more powerful computer, but
- the engineers at TI were under presure to get something done quickly
- with out re-engineering the entire computer system....
-
- What would you do?
-
- o Tie interrupt pins such that only one external interrupt level was possible.
- o You would probably implement the 256 bytes of onboard ram as
- 256 bytes of static ram on the 16-bit bus to
- simulate the on board cache, but would leave the
- rest of the system access as 8-bit reads ( done twice ).
-
- Does all of this sound familiar?
-
- These considerations have had one major impact. If TI had implemented the
- 9900 like it had been designed, anyone building a 4(a) compatible
- would have been forced to use the 99000 as an upgrade processor.
-
- Had to redesign the 99/4(a) to utilize the 9900 to it full capabilities,
- we would have had a vastly superior computer. Minicomputer class
- capabilities!
-
- While you can cripple a 9900 or a 99000 to act like a 9985 or 9995, you
- can not make the reverse happen.....
-
- The End
-
- L.D.O.M. 12.6.96
- ===========================================================================
- DTIHM014
-
- Highlights of the 99105A
- By Dan H. Eicher
-
- As you all know the 99/4(A) uses the 9900 CPU. The Geneve use the
- 9995. Well in the not to distance future you may have a new choice
- of what CPU you want to use in your 99/4(A).
-
- Don O'Neil and Gary Bowser are working on a new product called the
- "Accelerator" for the 99/4(A) community! Rather than just bring the
- 4(A) up to the same microprocessor that the Geneve uses they decided
- to surpass it.
-
- The 99105A is a third generation 9900 CPU. The first generation
- consisted of the 99xx's (used in the 99/4(a), the second generation
- consisted of the 9995 (used in the geneve) and the third generation
- consists of the 99105A and 99110 (The 99110 is no longer produced by TI).
-
- Below shows the pin assignments and definitions of the 99105A.
- ___ ___
- WE/IOCLK =1 U = MEM As you can see the TMS99105A is a
- RD = = BST1 40 pin dip package, unlike the 9900
- RESET = = BST2 which is a 64 pin wide body dip chip.
- APP = = BST3
- HOLD = = XTAL1/CLKIN The 99105A is only sold in high
- VSS = = XTAL2 reliability specifications. Which
- READY = = CLKOUT means it comes in a ceramic package
- INTREQ = = Vss and the leads of the chip are gold
- NMI = = ALATCH plated.
- IC0 = = PSEL/D15/OUT
- IC1 = = A14/D14 For further specifications you can
- IC2 = = A13/D13 order TI part #MP009, from 1-800-
- IC3 = = A12/D12 123-1234. This data book is called
- R/W = = A11/D11 the TMS99015A and TMS99110A
- Vcc = = A10/D10 Preliminary Data Manual. You may have
- A0/D0/IN = = A9/D9 to be persistant that you know the
- A1/D1 = = A8/D8 data books is available and the TI
- A2/D2 = = A7/D7 still makes the chip, because TI
- A3/D3 = = A6/D6 doesn't like to discuss 99xx based
- A4/D4 = 21= A5/D5 chips anymore.
- -------
-
- Whats new in the 99105A?
-
- * Pipe Line Architecture
- * Directly accessable 256K bytes of memory
- * 84-Instruction superset of the TMS9900
- - Signed multiply and divide
- - Long word (32-bit) shift, add, subtract
- - Load status register, load workspace pointer
- - Stack support - branch and push link, branch indirect
- - Multiprocessor support - test, test and clear, test and set
- * Privileged mode
- * Macrostore(1) emulation of user-defined instructions
- * Arithmetic falut interrupt
- * Illegal instruction interrupt
- * Multiprocessor system interlock signal
- * Attached processor interface
- * N-channel silicon-gate SMOS technology
-
- Lets look at some of these new features:
-
- 1. Pipe Line Architecture. If this chip had nothing more new to add to
- the 4(A) environment then this, this would be enough. Heres how pipe
- lining works.
-
- This example is from the book "The 99000 Microprocessor" by Avtar
- Singh.
-
- Lets take the assember instructions: A R0,R1.
-
- Step Function Type
- 1 Fetch instruction Memory
- 2 Decode instruction Internal
- 3 Fetch source operand Memory
- 4 Fetch destination operand Memory
- 5 Add operands Internal
- 6 Write resule to destination Memory
- ( Register to register addition sequence )
-
-
- Instruction fetch
- Decode
- Source fetch
- Destination fetch
- Process Instruction fetch
- Write Decode
- Source Fetch
- Destination fetch
- Proces Instruction Fetch
- Write Decode
- Source Fetch
- \_____________________________ _____________________________________/
- V
- Prefetch Mechanism
-
- " Looking at the instruction sequence, we see that during the
- two internal operations the system bus to external memory is
- not busy. To make more efficient use of the system bus, the
- 99000 is implemented with an intelligent instruction prefetch
- mechanism. With the mechanism, the execution of consecutive
- instructions is overlappped. This feature is also known as
- pipelining.
-
- Notice that while the first instruction is being processed,
- the 99000 initiates an instruction acquisition memroy bus
- cycle to fetch the next instruction. This second instruction
- is decoded while the results from the first instruction are
- being written to memory. In this way, we see that during each
- of the six steps of the addition instruction, the system bus
- is always in use."
-
- As you can imagine this improves system through put dramatically
- with out running the system any faster. The 99000 prefetch is
- intellegent. On the 99xx your program counter gets an instruction
- and increments the program counter (PC), well if the instruction that
- was just fetched happens to be a jump or branch instruction then
- the microprocessor just turns around and updates the program
- counter. With an intellegent prefetch the system "knows" if the
- instruction just fetched is a jump or branch if it is the system
- updates the PC with the next memory location to be used, NOT the
- next seqentail address.
-
-
- 2. More memory (up to 256K bytes). Heres what the memory map looks like
- in extended mode. The way this is done is by using PSEL and (BST1-
- BST3) to provide extended address lines.
-
-
- MAIN MEMORY SPACE
- |
- -------------------------------
- | |
- INSTRUCTION DATA
- SEGMENT SEGMENT
- (64K) (64K)
- | |
- ------------ ------------
- | | | |
- PAGE 0 PAGE 1 PAGE 0 PAGE 1
- (64K) (64K) (64K) (64K)
- \_____________________ ________________________/
- V
- 256K BYTES
-
- Of course on a standard 4(A) you would need a special memory board
- to take advantage of this much memory. (Don is working on a way to
- fix you up with a new memory board also).
-
- 3. Macrostore
- An entire book could be deducated to the subject of Macrostore alone.
- In brief, macrostore is a way to add to the native instruction
- set of the 99000. Lets say you need an op-code that will give you
- the square root of a number. Define it! Then in your source code
- you can have an instruction like SQRT R1 or SQRT R1,R2!
-
- TI had one version of the 99000 that had the entire UCSD pascal
- kernal all in Macrostore code. The 99110A had floating point
- instructions built into its macrostore. This eliminated the
- need to have a seperate numeric coprocessor.
-
- 4. Privileged Mode.
- When privileged mode of operation is selected two levels of operators
- are created, one designated the user and the other the supervisor.
- Certain instructions are then barred for use from the users
- programs. These operations include SBO, SBZ, LDCR, LIMI, RSET,
- LST, RTWP, IDLE, CKON, CKOF, LREX LDS, LDD. All of these op
- codes modify settings that could disturb the running of other
- programs in a multiuser/multitasking environment.
- So in short this mode of operation was designed to facilitate
- the development of multiuser/multitasking system software.
-
- 5. Attached processor interface + Attached computer interface.
- The 99xxx family has the capability to "attach" either another
- computer or processor to its self. This is similar to the 8086
- family of processors ability to use an 8087. Although with the
- ability to have special floating point opcodes in macro store
- a numeric co-processor is not need. (For detailed information
- on a 99110 V.S. an 8086 with a co-processor see.....
-
- Here is the evaluation
- sequence that the 99xxx goes through when it goes to execute
- the next op code from a program:
-
- If it is a stndard op code then "Execute standard MicroCode"
- Else
- If (*) an attached computer then "Invoke and continue"
- Else
- If (*) an attached computer then "Invoke and wait"
- Else
- If it is an opcode defined in Macrostore then "Invoke emulation"
- Else
- If it is an opcode defined in main memory the "Invoke emulation"
- Else
- Handle as an illegal opcode.
-
- * it is an opcode recognised by..
-
-
- 6. Op Code Compression
- While not highlighted as a feature 99xxx family another
- interesting aspect to its design is the way op-codes are
- scrunched in memory. This allows much more efficient use
- of the pipeline fetches.
-
- Who to contact about availability:
-
- Bud Mills
- 166 Dartmouth Drive
- Toledo, OH 43614-2911
- (419)-385-5946
-
- Tenative price is two hundred and fifty US dollars.
-
- References:
-
- Singh, Avtar, "The 99000 Microprocessor". Englewood Cliffs, N.J.:
- Prentice-Hall, Inc, 1984. ISBN 0-13-622846-1
-
- Texas Instruments Incorporated, TMS 99105A and TMS99110A 16-Bit
- Microprocessors Preliminary Data Manual. Houston:Texas Instruments
- INC, Nov. 1982
-
- L.D.O.M. 12.6.96
- ==========================================================================
-
- DTIHM015
-
- #1 5-JUL-1992 18:59:42.60 MAIL
- From: BOS::JHWHITE
- To: EICHER
- CC:
- Subj: bugs, bugs, and more bugs
-
- Dan: I've been looking over the console ROM source code and have located the
- main problem with the interrupt routine. Two instructions are reversed. The
- console ROM has the following:
-
- 0918 020C LI R12,>0F00 loads CRU base with >0F00
- 091A 0F00 to start CRU scan of DSR peripherals
- 091C 1D01 SBO 1 enables meaningless bit >0F02
-
- The above can be seen (in slightly different fashion) on page 29 of TI Intern.
- What should be there is the reverse, which could solve lots of trouble:
-
- 0918 1D01 SBO 1 clears External Interrupt and re-enables
- 091A 020C LI R12,>0F00 loads CRU base with >0F00
- 091C 0F00 to start CRU scan of DSR peripherals
-
- So just dump a working console ROM, search for 020F1D in the even bank, and
- replace with 1D020F. Replace 0C0001 in the odd bank with 010C00. If you
- want, I can send you fixed ROM files with correct CRC values at the end.
-
- With the TI RS232 DSR, TI compounded the interrupt problem by (re-)enabling
- the RS232 interrupt even if the the RS232 was not the initiating peripheral.
- The fix is a one byte change. An excerpt from TECHNICAL DRIVE (pp32,33)
- shows the problem code:
-
- 40EA 1F10 TB >10 ** Test for character received
- 40EC 1310 JEQ $+>22 >410E ** Yes?, then jump
- 40EE 1F1F TB >1F ** Data set change, timer interrupt
- ** transmitter interrupt?
- 40F0 1632 JNE $+>66 >4156 ** No?, then jump
- 40F2 C306 MOV R6,R12 ** Restore CRU address
- ....
- 4156 1D12 SBO >12 ** Set receiver interrupt enable
- 4158 C306 MOV R6,R12 ** Restore CRU
- 415A 1E07 SBZ >07 ** Turn off LED
- 415C 0455 B *R5 ** Return
-
- Any interrupt that is not cleared before the CRU peripheral scan gets to the
- RS232 will cause the RS232 interrupt to turn on. The console ROM interrupt
- bug (for which I gave the fix) causes ALL peripherals to be checked for
- interrupts unless a DSR clears the External Interrupt with the equilavent
- of: CLR R12; SBO 1.
-
- An example of the problem is the Digit AVPC and the TI RS232, which share
- the External Interrupt line. The RS232 is normally at CRU>1300 and the
- AVPC is at CRU>1400. The VDP interrupt is active on the External Interrupt
- line. The console CRU peripheral scan finds the RS232 interrupt routine
- first, which we'll assume is supposed to be inactive.
-
- The RS232 interrupt routine tests the CRU bits on the UART's (9902A's), and
- falls through to the instruction at >40F0, which determines that there is
- no active RS232 interrupt. Then it jumps to the instruction at >4156 which
- turns ON the RS232 interrupt (BAD MOVE) and is followed by the exit back
- to the CRU peripheral scan.
-
- No more RS232 interrupt routines are available, so the CRU peripheral scan
- goes to the next peripheral, at CRU>1400 -- the Digit AVPC. The AVPC
- interrupt routine should then execute properly (though Digit and OPA DSR's
- are somewhat lacking, either failing to test conditions or leaving the
- interrupt hanging). For the sake of this attack on TI code, I'll leave
- Digit and OPA out of it. Just assume that the AVPC DSR does everything it
- should as if the TI code was not buggy.
-
- The first VDP interrupt goes as planned. However, now the RS232 port 2
- interrupt is enabled whether it was supposed to be or not. And the console
- ROM did not clear the External Interrupt (the bigger problem). Consider
- the failure to clear the External Interrupt again. If that line is never
- reset, the first VDP interrupt causes the interrupt routine to be active
- each time interrupts are turned on whether an actual interrupt occurs or
- not.
-
- The RS232 mis-activated interrupt only becomes a problem when the RS232 port
- 2 receive buffer gets filled. Normally, RS232 interrupts are only activated
- by the RS232 Circular Buffer routine used by TE's. This too can cause trouble
- if the AVPC is installed without a circumventing DSR. But the bug in the
- RS232 DSR also means that TE's that do polling rather than use interrupts
- will cause problems with the AVPC installed.
-
- Now to the RS232 fix. If no RS232 interrupt is active, the RS232 interrupt
- routine should not turn them on. This means that the instruction at >40F0
- should be changed to jump to >4158 instead of >4156:
-
- 40F0 1633 JNE $+>68 >4158
- 40F2 C306 MOV R6,R12
- ...
- 4156 1D12 SBO >12
- 4158 C306 MOV R6,R12
- 415A 1E07 SBZ >07
- 415C 0455 B *R5
-
- Thus, if you dump your RS232 EPROM and find >32 at byte offset >00F1, replace
- it with >33.
-
- I'll hold off on sending you a workable AVPC DSR until you tell me which of
- the above fixes you implement. Fixing both the console ROM and RS232 DSR
- is the best alternative.
-
- Jeff White
-
- ============================================================================
- DTIHM016
-
- Setting up user interupt routines.
- by Jeff White
-
-
- 37476 13FEB93-2100 General Information
- RE: CLIPBOARD99 (Re: Msg 37475)
- From: JHWHITE To: EICHER
-
- Dan: Simply daisy-chain your interrupt routine over any already loaded at
- address >83C4. Check the value at >83C4 upon loading your interrupt routine.
- Whatever its value, you should save it in your routine. Now copy the start
- address of your interrupt routine to >83C4. At the end of your interrupt
- routine, check the address you saved. If not zero, branch to it. Otherwise
- return. Jeff
-
- p.s.: This is the correct procedure for any VDP interrupt driven routine. You
- save the address at >83C4 into the new interrupt routine before putting the
- start address of the new routine at >83C4. Then you check the value you saved
- at the end of your interrupt routine, and if equal, return, else branch to the
- previous interrupt in the chain.
-
- -*-
-
-
- 37495 14FEB93-2009 General Information
- RE: CLIPBOARD99 (Re: Msg 37484)
- From: JHWHITE To: JDELEKTO
-
- Joe, you are quite right that daisy-chaining interrupt routines slows things
- down. I am aware of means to speed things up. Console sprite motion, sound,
- and quit key interrupts can be disabled by simply make bit 0 (MSbit) of the
- interrupt flag byte at >83C2 equal to 1. The user interrupt routine can still
- be active, and it can use the interrupt flag byte to flag various interrupt
- routines. In fact, the byte at >83C3 is NEVER used by the console (though
- some Dijit AVPC systems use it), so you can have an interrupt flag word.
-
- The user interrupt routine(s) can control sprite motion any way you wish, and
- the motion information can be in CPU memory instead of VDP memory if the
- routine is written to handle it. Sounds lists are not limited to VDP or GROM
- memory either. Even a fast keyscan can run off the interrupt if you desire.
-
- If you decide to use the the console interrupt routines (bit 0 of byte >83C2
- equal to 0), there are still the 12 lsbits of the WORD at >83C2 to flag
- user interrupt routines. You can have more than 12 if you are content to
- let the 4 msbits of byte >83C2 serve dual purpose (no console ROM-driven
- sprite motion if byte >837A is >00, no console ROM-driven sound if byte
- >83CE is >00, no quit key if not pressed). Or if you are really clever, you
- can use all 16 bits of the word at >83C2 to flag user interrupt routines by
- reversing polarity. I.e., if any of the 4 msbits of word >83C2 is 1, then
- the related user interrupt routine is executed while the related console
- ROM-driven interrupts are not. The 12 lsbits of word >83C2 can flag up to
- 24 interrupt routines (if both bit values enable).
-
- Of course, you could redefine the word at >83C2 to work differently than the
- console usage. When bit 0 is 0, the 12 lsbits can mark 4096 locations in an
- interrupt vector table. When bit 0 is 1, the 15 lsbits can mark 32768 locations
- in an interrupt vector table. With the AMS/AEMS or 4A Memex systems, you are
- only limited by your imagination (and how much of a slowdown you can stand).
-
- If you want to execute 32768 interrupt routines in rote, make bit 1 of >83C2
- equal to 1 and load user-interrupt vector >83C4 with the address of the
- user-interrupt handler. Use the 5 msbits of the 15 lsbits of >83C2 to mark
- a page of AMS memory, and the 10 lsbits of the 15 lsbits of >83C2 to mark an
- offset in that page. If you want BLWP vectors, two words will have to be
- marked by each of the 10 lsbits, or the entire 4K of each of the low 32 pages
- could be used. However, the two words could be used as a pseudo-BLWP vector.
- The 5 msbits of each word in the pseudo-BLWP vector could be used to mark
- which pages of the next 32 pages (eg, 32-63) the routine and its workspace
- use. The 11 lsbits of each vector address would mark the word offset. If
- you wanted, the workspace pointer of the pseudo-BLWP vector could point to
- a page in 32-63, and the program counter of the pseudo-BLWP vector could
- point to a page in 64-95.
-
- Of course, each time the user-interrupt handler is called, the value in the
- word at >83C2 is incremented and the msbit is set to 1 to prevent console
- ROM-driven interrupts from taking place. Though if console ROM-driven
- interrupts are needed, the use-interrupt handler can still have up to 4096
- interrupt routines handled in rote. Just use bits 4 and 5 of word >83C2
- to mark 4 pages of AMS memory for the 4096 pseudo-BLWP vectors. The 10 lsbits
- of >83C2 would be the vector offset in the page.
-
- This all seems quite ridiculously esoteric, doesn't it? However, you may now
- be thinking about what I am about to describe. A VDP-interrupt-driven OS --
- VIDOS for short -- that puts the OS opcode number in the up to 15 (12 if you
- want to use console sprite motion, sound lists, and quit) lsbits of >83C2.
- The user-interrupt handler now becomes the VIDOS opcode handler with a few
- simple modifications.
-
- Say we use only the 12 lsbits of >83C2. A value of >000 tells the VIDOS to
- run its interrupt service routine. Values >001-FFF can be opcodes that do
- something. The 4 pages marked by the 2 msbits would contain the pseudo-BLWP
- vectors just as I described above. Parameters can be passed to the VIDOS
- opcode in CPU PAD, VDP PAD, or some page mappable to the 32K memory.
-
- In fact, you could even do a GPL interpreter with this VIDOS. Say that
- GPL opcodes >00-FF are passed to VIDOS as >C00-CFF. This would put the
- pseudo-BLWP vectors in the 4th page (11b), and the opcode marks the right
- vector.
-
- That should be enough food for thought right now. Sure, the interrupt routine
- of the console ROM is not that great. But some great things can be done with
- it and enough memory.
-
- Jeff White
-
- p.s.: I had another message describing another method to handle user interrupts,
- but I accidentally deleted it.
-
- -*-
- ============================================================================
- DTIHM17
-
- Interupts
- by Jim Ness
-
- INTERRUPT ME!
- -------------
- How to use (and abuse) your computer's interrupt capabilities.
- -By Jim Ness
-
- ----------------------------------------
-
- October, 1984
- *************
-
- Whether you program in assembly language on a TI99/4A computer, or most any
- other, you probably have come across a few references to "Interrupt Handling."
- If you react to the unknown the way I do, you probably skipped it, because
- you didn't need to know what it was all about. Once I had some of the basics of
- assembly language programming down, I came back to it. I had just seen an int-
- errupt driven clock/timer program, and decided it was time to see what made it
- tick (sorry, it was irresistable). In this first chapter, we'll see what
- interrupts are all about. Why are they necessary, when do they come in handy,
- and a beginning on the do's and dont's of programming with interrupts.
- *****
- The beast we all call "Computer" is a narrow minded individual. It does what
- you tell it and does not pay attention to anything else. From the time you turn
- the power on, it is performing a task. In the case of the TI99/4A, a "power-
- up" routine is run, checking all the closets and corners to see what periph-
- erals are connected, and then displaying the color bar screen, and waiting for
- you to press any key.
-
- The problem with single-mindedness is that there are always a couple of things
- you would like to be able to do at any point in a program. For instance, you
- would like to be able to "QUIT" at any time. But if your program is busy adding
- numbers or printing text or displaying graphics, it doesn't care about your de-
- sire to "QUIT." It's busy.
-
- The solution is to have a timer stop the program on a regular schedule, and
- check to see if there are alternate tasks to perform, such as paying atten-
- tion to the goof trying to "QUIT."
-
- The TI99/4A, and all other modern computers have that capability built in to
- the operating system. Traditionally it is used to implement internal functions
- such as system reset or peripheral data transfers (disk or cassette). You don't
- want your program to move along before your disk drive is finished transferring
- data, for instance.
-
- But in the case of the ole TI99/4A, there is provision made for the user to
- add his/her own interrupt. There is an address located in the onboard CPU RAM
- which is checked 60 times per second. If there is a memory address "poked" in-
- to here, the program will branch to that address and perform what ever task
- is placed there. So, you could have a keyboard scan routine there to check for
- a "QUIT" command. Or a screen color or character change command. Or any pro-
- gram your little heart desires.
-
- ********
- If you have read up on interrupts in the TI99/4A Editor/Assembler manual, you
- will have seen their mention of using up all the processor's time handling the
- interrupts. THIS is the big pitfall. Suppose you design a little routine to
- re-define each of the characters and the screen color, but you don't pay too much
- attention to the efficiency of your program. You may end up with quite a long
- routine. Say your routine takes 150 ms to perform, more than a tenth of a sec-
- ond. Remember that an interrupt routine will be called each time 1/60th of a
- second has passed.
-
- So here is the resulting time-frame:
-
- - 17 ms - The program
- - 150 ms - The interrupt
- - 17 ms - The program
- - 150 ms - The interrupt
- - 17 ms - The program
- (**etc**)
-
- You can see that the interrupt routine will run in its entirety each time, but
- the main program runs in tiny jerks and has to keep stopping for the interrupt
- routine. The result is that the main program ends up running very sllooowwww.
- And you have slowed it down just so you could have your favorite characters and
- screen color.
-
- The point is that if you want to use an interrupt routine, it must be very
- short and efficient. It must do one very important thing and quickly go back to
- the main program. The ideal interrupt would finish up in the 1/60 second time
- slot that the clock allows. If it took exactly 1/60 (17ms) it would share time
- on a 50/50 basis with the main program,so even that is a little too long.
-
- It is hard to figure if your interrupt program will be too long, but here is a
- rule of thumb to follow: Make yoursource listing no more than 20 lines
- long. The resulting program, after assembly, regardless of what it is, will
- be short enough.
-
- Your homework question:
- Which method of file access would be acceptable for use in an interrupt rou-
- tine?
- (A) Disk Drive
- (B) Cassette
- (C) 128k card
- (D) Minimemory
-
- Well, if you have been paying attention, you know that none of the above is
- usable. Because of the time restrictions that must be followed, you just can't
- wait for data to be transferred, even at the speed that the MMM and 128k 'ram
- disk provides.
-
- One question that has come up is where can we 'poke' the starting address of
- our routine so that it will run. Per the Editor/Assembler manual, the address of
- the user defined interrupt routine must be put into >83C4. The simplest way to
- do this is to use an 'AORG' statement near the end of the program, to force
- the loader to move to that memory address, and then use a 'DATA' statement to
- fill that address with the beginning address of your routine. Check the ex-
- amples below to see what I mean.
-
- Through the magic of TI-EXTENDED BASIC file handling routines, I am appending
- my DV80 source code files to this text, so you can see the examples. If you do
- not wish to take the time to go through them, just key "A" to abort this section
- on the BBS, and check back later, if you want.
-
- The source codes shown are in DV80 format and sometimes exceed the 40 col-
- umns on your screen, so you will see a few wraparounds. One way to solve the
- problem is to save what appears and reread it with the Editor/Assembler in
- edit mode, or with TI-Writer.
-
- The two programs shown are SETCOLOR & SETCHAR, both of which appeared in the
- D/L section of this BBS. Setcolor will change the color of screen and chars in
- Xbasic, and Setchar adds a real lower case charset. Each of them override the
- Xbasic interpreter's defaults.
-
- ---------
-
- ***************************
- * *
- * ASSEMBLY LANGUAGE *
- * ROUTINE TO CHANGE *
- * THE TEXT AND SCREEN *
- * COLORS IN X-BASIC *
- * FOR PROGRAMMING *
- * *
- * BY LARRY BENTLEY *
- * 9/29/84 *
- * *
- ***************************
- DEF COLOR
- *
- * SET EQUATES FOR XBASIC
- VMBW EQU >2024
- VWTR EQU >2030
- C DATA >F4F4,>F4F4,>F4F4,>F4F4 * SET 8 BYTES ASIDE TO LOAD
- COLOR LI R0,>07F4 * CHAR COLORS. ALSO LOAD VDP
- BLWP @VWTR * R1 WITH SCREEN BKGRD COLOR
- LI R0,2048 * START LOADING CHARSET COL-
- LI R1,C * ORS
- LI R2,8
- BLWP @VMBW
- LI R0,2056
- BLWP @VMBW
- LI R0,2064
- BLWP @VMBW
- LI R0,2072
- BLWP @VMBW
- B *R11 * RETURN TO MAIN ROUTINE
- AORG >83C4 * DURING LOADING, MOVE TO >83C4
- DATA COLOR * PUT THE ADDRESS REPRESENTED BY
- END * COLOR INTO >83C4
-
- *--------------------------------------------------*
- **********************************
- * THIS ASSEMBLY LANGUAGE ROUTINE *
- * CHANGES THE DEFAULT LOWER CASE *
- * CHARACTERS TO TRUE LOWER CASE, *
- * INSTEAD OF JUST SMALL CAPS. *
- * -BY JIM NESS, OCT. '84 *
- **********************************
- DEF LOWCAS
- VMBW EQU >2024
- CHARS DATA >0000,>0070,>0838,>4874 ; a
- DATA >0040,>4078,>4444,>4478 ; b
- DATA >0000,>0038,>4440,>4438 ; c
- DATA >0004,>043C,>4444,>443C ; d
- DATA >0000,>0038,>447C,>403C ; e
- DATA >0018,>2420,>7020,>2020 ; f
- DATA >0000,>0438,>4438,>047C ; g
- DATA >0040,>4078,>4444,>4444 ; h
- DATA >0010,>0030,>1010,>1038 ; i
- DATA >0008,>0018,>0808,>4830 ; j
- DATA >0040,>4048,>5070,>4844 ; k
- DATA >0030,>1010,>1010,>1038 ; l
- DATA >0000,>0078,>5454,>5454 ; m
- DATA >0000,>0058,>2424,>2424 ; n
- DATA >0000,>0038,>4444,>4438 ; o
- DATA >0000,>0078,>4478,>4040 ; p
- DATA >0000,>0038,>4454,>4834 ; q
- DATA >0000,>0058,>6440,>4040 ; r
- DATA >0000,>003C,>4038,>0478 ; s
- DATA >0010,>1038,>1010,>1408 ; t
- DATA >0000,>0048,>4848,>4824 ; u
- DATA >0000,>0044,>4428,>2810 ; v
- DATA >0000,>0044,>5454,>5424 ; w
- DATA >0000,>0044,>2810,>2844 ; x
- DATA >0000,>0044,>2418,>1060 ; y
- DATA >0000,>007C,>0810,>207C ; z
- LOWCAS LI R0,>0608 * START AT CHR 97, VDP ADDR >0608
- LI R1,CHARS * REFER TO ABOVE NEW CHARS
- LI R2,208 * 208 NEW BYTES
- BLWP @VMBW * LOAD THEM
- RT * RETURN TO XBASIC
- AORG >83C4 * DURING LOADING, GO TO >83C4
- DATA LOWCAS * STICK THE ADDR OF THIS ROUTINE THERE
- END
-
- -----------------------------------------------------------------
-
- So that is the end of my article on the use of interrupts in assemble
- language programs. Hopefully you have some new info now that you can
- use in future programs.
-
-
- ============================================================================
- DTIHM018
-
-
- 40849 28OCT93-2315 Communications
- Circular Interrupt Input Buffer Operatio
- From: JHWHITE To: BRADSNYDER
-
- Here it is, the complete TI description of the circular interrupt input
- buffer operation.
-
- Home Computer EIA RS232C Peripheral Specification 08MAR 82
-
-
-
- 7.0 CIRCULAR INTERRUPT INPUT BUFFER OPERATION
-
-
- THIS FEATURE CANNOT BE USED IN A BASIC LANGUAGE PROGRAM
- BECAUSE OF THE COMMON CPU RAM USAGE, LOCATIONS 0-5.
-
- This option is enabled by calling the RS232 peripheral
- DSR with an operation code of HEX 80, most siginificant bit
- set plus an OPEN operation code in, the I/O opcode (byte 0)
- of the PAB. The normal processing for an OPEN command is
- executed but the receive interrupt is enabled as part of the
- OPEN.
-
- The CPU RAM usage is as follows:
- LOCATION MEANING
- 0-1 (2 byte) address of start of buffer area
- 2 (1 byte) length of buffer (1-255 bytes)
- 3 (1 byte) callers read offset value
- 4 (1 byte) RS232 DSR write offset value
- 5 1 byte NOT DEFINED
-
- When the RS232 get an interrupt it attempts to store
- the the input data byte to VDP memory address (word 0 + byte
- 4 offset + 1) address. When (byte 3 offset)=(byte 4 offet
- +1) an overrun error is declared and the data byte at
- address (word 0 + byte 4 offset) is overwritten with a HEX
- FE as long as this condition is present. If an input
- hardware framing, overrun, or parity error occurs and there
- is not an overrun condition a HEX FF is returned as the
- character code. When (word 0 + byte 4 offset + 1) > (byte 2)
- the write offset (byte 4) is set to zero and (word 0 + byte
- 4 offset) is used as the write address. This functions as a
- circular interrupt buffer.
-
- A user of this feature should read data whenever
- (byte 3) <> (byte 4). each time a data byte is read (byte 3)
- should be incremented by one. Inorder to read data increment
- (byte 3) to the next offset and then use the address (word 0
- + byte 3). When (word 0 + byte 3 offset + 1) > (byte 2) the
- read offset (byte 3) is set to zero and (word 0 + byte 3
- offset) is used as the read address.
-
- When input is done in this manner the software switch
- options described in the GENERAL SPECIFICATION SECTION 3.1
- have no effect. However the hardware switch options control
- the input TMS9902.
-
- The output section of the port that is OPENed in this
- manner may still be used so long as the hardware switch
- options are the same. One OPEN statement can OPEN input for
- interrupt mode and output with switch options because the
- interrupt input ignores the software switch options.
-
-
-
- PAGE 8 ** TI Internal Data **
-
-
- p.s.: It is typed exactly as it was printed.
-
- -*-
-
-
- ===========================================================================
- DTIHM019
-
- Corcomp RS232 and PIO Internals
- by Jeff White.
-
- 33837 25AUG92-2240 General Information
- RE: TI FAIR (Re: Msg 33834)
- From: JHWHITE To: LEIGHTYM
-
- Michael: The following is part of a message I sent Email to Dan Eicher and/or
- Don O'Neil in regards to the Corcomp RS232. Unfortunately, I cannot find the
- rest of it. Maybe Dan or Don can provide the "rest of the story" if they have
- filed the message better than I did.
-
- "Here are the CorComp PIO port definitions:
-
- Pin(s) Function
- ------ --------
- 1 Strobe
- 2-9 D7-D0
- 10 Busy
- 11 Ground
- 12 10 Ohm PU to +5V
- 13 Spare Busy
- 14 Spare Strobe
- 15 1K PU to +5V
- 16 GND
-
- Here are the CorComp CRU bit definitions and 9901 connections. A10 is inverted
- to swap P0-P15 to the lower bits:
-
- CRU I/O Function 9901
- ------- -------- ----
- 0 ROM enable P0
- 1 Spare flag P1
- 2 Strobe P2
- 3 Spare strobe P3
- 4 Flag bit P4
- 5 RS232/1 CTS- P5
- 6 RS232/2 CTS- P6
- 7 LED P7
- 8-15 D0-D7 P8-15
-
- CRU Input Function 9901
- --------- -------- ----
- 21 Spare Busy !INT5
- 22 Busy !INT6
-
- The 9901 interrupt line is not connected to the bus. Bits 0-15 of the CC are
- really outputs, though their states can be read. P1 and P4 are unconnected,
- so they act as "flag" bits. P8-P15 can be used as PIO Inputs if the 9901 is
- programmed properly. !INT1 to !INT4 are unconnected, so they have little
- functionality. However, the 9901 Clock on an internal !INT3 can be used for
- timing purposes. !INT7 to !INT15 are shared by P15 to P7, respectively.
-
- The card has no buffer chips (244 or 245) on it, which means the 9901 and 9902
- chips are not isolated from the backplane bus. Also, applying inputs to the
- PIO port while the the 9901 is programmed to Output mode on just one of the
- data or strobe pins can destroy the 9901. It would have been better had bit 1
- of the CRU been designated the I/O select bit (as it is on the TI card) such
- that it could control a bidirectional bus. Software that put the bus into..."
-
- I lost a very important part of that message. Note how the data lines (D0-D7)
- are attached to the 9901 and PIO port -- BACKWARDS! This means that sending
- out the Corcomp PIO port requires the bits of the data byte to be reversed
- with a standard cable (and in the standard DSR). Reversing the data bits means
- program overhead -- an algorithm to reverse them, a lookup table, or some
- combination of the two.
-
- IMHO, it is a colossal waste of a 9901 to use it as it was on the Corcomp RS232
- card. 259's and 251's are cheaper, and easier to get, if you want to put the
- _parallel PIO_ (redundancy for effect) on the _serial_ CRU bus.
-
- Sure, if CC had hooked the 9901 up correctly, a simple "LDCR Rx,8" would have
- worked. Instead, it requires a "LDCR @revbit(Rx),8" or some algorithm before
- the "LDCR Rx,8" (see source code to Fast Term or Mass Transfer for PaulC's
- kludge code).
-
- On the TI, MYARC, and Ultracomp, you can "MOVB Rx,@PIO" to send out the PIO
- port. The Axiom interface will use the "LDCR Rx,8" without reversing the
- data bits -- i.e., Axiom has the data lines hooked INTELLIGENTLY.
-
- My recommendation for anyone designing a new RS232 card with PIO port is to
- simply put the PIO port at byte >5FFE (the top of DSR space). It's quite
- silly to limit the DSR to only 4K, when 8K EPROM's are not much more expensive.
- Sure, a new DSR would be needed, but only for the PIO part. The serial ports
- should still left as is for compatibility reasons.
-
- Jeff White
-
- (c) Copyright 1992
-
-
- 33855 27AUG92-0119 General Information
- RE: TI FAIR (Re: Msg 33853)
- From: JHWHITE To: LEIGHTYM
-
- Michael: I never said the bits weren't right on the PIO port. They are
- attached incorrectly to the 9901. Need an example, huh? Say that you load
- the value for 'A' into R2 and put it on the CC PIO port:
-
- CCPIO EQU >1310
- A TEXT 'A'
- EVEN
- START LI R12,CCPIO
- MOVB @A,R2
- LDCR R2,8
- ...
-
- The ASCII value for 'A' is 65 or >41 or b01000001. Now look what that LDCR
- instruction does. It starts at CRU>1310, puts bit 7 of R2 there, goes to
- CRU>1312, puts bit 6 there, etc. I.e., the following is what you get:
-
- CRU bit Value PIO data line
- >1310 1 D0
- >1312 0 D1
- >1314 0 D2
- >1316 0 D3
- >1318 0 D4
- >131A 0 D5
- >131C 1 D6
- >131E 0 D7
-
- Note that in TMS 9900 lexicon, bit 0 is the MSbit and bit 7 is the 8th MSbit.
- Thus, what the Corcomp did was put the 8th MSbit of R2 (in the example) at
- the MSbit position of the PIO port, the 7th MSbit at the 2nd Msbit, or to
- wit:
-
- PIO data line R2 MSbyte
- MSbit 8th MSbit
- 2nd MSbit 7th MSbit
- 3rd MSbit 6th MSbit
- 4th MSbit 5th MSbit
- 5th MSbit 4th MSbit
- 6th MSbit 3rd MSbit
- 7th MSbit 2nd MSbit
- 8th MSbit MSbit
-
- Now you should see that rather than get 'A' on the port, you get character 130
- (b10000010 or >82) on the port. Therefore, to put 'A' on the CC PIO port, you
- could put the value >82 in R2 and do the LDCR R2,8. In any event, the bits
- must be reversed in the data byte before being sent out the CC PIO port, or
- you would rewrite the DSR and swap the data lines on the PIO cable.
-
- I've got two MYARC, one Corcomp, one Ultracomp, and used to some TI RS232
- cards here. They are all quirky, but by far the Corcomp is the biggest
- kludge. However, without the '244 on the CC PIO port, it CAN be bidirectional.
- You must be VERY careful though when hooking an input device to the CC PIO
- per this version of the card, as it CAN and WILL destroy the 9901 if inputs
- are allowed while the 9901 data lines are in output mode. It might not do
- the external device any good either.
-
- Now what exactly is wrong with the MYARC PIO? I guess you are referring to
- the missing CTS lines.
-
- Jeff White
-
- p.s.: How much does the 9901 cost? How about the 259? I expect on a bad day,
- you could buy twenty 74LS259's for the price of one 9901 (if you can find it).
-
- p.p.s.: If you do copy Corcomp's PIO design, I hope these messages haunt you
- for the rest of your life. :-)
-
- -*-
- =============================================================================
- DTIHM20
-
- Bring your Myarc RS232 into the nineties!
- By Jeffrey H. White and Dan H. Eicher
-
- When the Myarc RS232 card first came out, people were impressed by the fact
- that this card could be opened at 19,200 bps! TI and Corcomp had only listed
- open statement up 9,600 bps in their manuals. It was only later ( after we had
- become much more sophisticated, right? ) that we came to realize that the
- RS232's manufactured by the big three ( TI, Corcomp and Myarc ) were all
- capable of very fast speeds. In the cases of Corcomp and TI cards, 19.2 ( as
- it is commonly called ) was not coded into the DSR bit rate tables, but they
- are actually capable of these speeds and more, if you are working in assembly.
-
- What follows below is two modifications that can be made to the Myarc RS232
- card. The first is a simple fix that will make the second serial port function.
- The other is an upgrade/enhancement to the abilities of your card!
-
- Some people ( myself included ) have had difficulties using the second RS232
- port on Myarc cards. This is because of a design screw-up. The orginal board
- layout did not properly implement the RS232 port. The DTR line from pins 18 and
- 19 was hooked up to an output of the quad line receiver (1489), and the
- corresponding input was then connected to the !CTS (pin 6) and !DSR (pin 7)
- inputs of the 2nd UART (9902A). It only takes three jumpers to fix this, but
- some times these jumpers were installed wrong or not at all by Myarc when
- shipping RS232 cards.
-
- Here is what you need to do to ensure your card is modified to function
- properly with its second port:
-
- The trace from pin 4 of the 1489 must be cut so there is no continuity with
- pins 6 and 7 of the closer 9902A. Still on the front of the card is a trace
- from pin 6 of the 1489 to a solder pad between pins 4 and 5 of the quad line
- driver (1488) that must be cut. On the back of the card, the trace from pin 6
- of the 1489 to the leg of a 2.2k resistor must be cut. On the back, run a
- jumper from the solder pad between pins 4 and 5 of the 1488 ( trace from pin 19
- of the D-sub ) to pin 4 of the 1489, then from that pin 4 to the leg of the
- 2.2k resistor. Jumper from pin 6 of the 1489 to either pin 6 or 7 of the closer
- 9902A.
-
- If this is done correctly, your second RS232 port should work, given no bad
- solder joints or chips. The quickest and easiest way to check this modification
- out is to use a TI built Y-splitter cable for the RS232 and hook a modem with
- status lights up to the second port. If everything seems to work, you are set.
- Alternatively, if you have a Y-splitter cable and a breakout box, you can now
- use the breakout box to test functionality of the second port.
-
- On to the enhancement:
-
- As high speed modems have become more commonplace, a few transitions in the
- typical use of RS232 have occurred. The first being in the area of speed. When
- the TI RS232 card was originally designed, one of its primary purposes was to
- interface to a printer -- in fact, TI's impact printer ( an Epson with the TI
- logo ) was designed for serial usage. The maximum bit rate for the typical
- printer of that time was around 120 CPS ( Characters Per Second ), with each
- character requiring around 9 bits, so it was no real challenge for the RS232
- port to keep up with the printer.
-
- Very quickly, with the rise of the TIBBS BBS by Ralph Fowler, hooking up a
- modem became the thing to do..... We have all seen the gradual increase in
- modem speeds occur. First 300, then 1200, followed shortly by 2400. But, only
- within the past year have 9600 and 14.4 modems become affordable to us common
- users.
-
- While 300/1200/2400 bps modems present computers and serial ports with little
- challenge, the same can not be said for speeds over 9600 ( actually a 9600 bps
- modem runs even faster, if you consider modems implementing MNP5 and 42 bis
- utilize 'on the fly' data compression ).
-
- The first change that must occur to accomodate faster communication speeds is
- your communication software. There are two primary methods of handling flow
- control. Flow control refers to the agreed upon way of deciding if the
- computer or the device it is talking to ( a modem perhaps ) is ready to send or
- receive. At low transmission speeds ( under 9600 baud ) the most common form of
- flow control is called XON/XOFF. This can be accomplished using only 2 wires (
- Transmit and Receive ). This works based upon the practice that both devices
- have agreed upon characters they will both utilize for "OK to send" (XON) and
- "Whoah, hold on a sec!" (XOFF).
-
- This method does not work very well at high speeds. The problem is, in between
- the time it takes for one system to say, "Whoah, hold on a sec!" and the other
- system actually "Whoahs," an awful lot of data can pass under the bridge.
-
- So, what do you do? You use some more of the pre-defined control wires in the
- RS232C definition. The wires most commonly used for this function are DTR and
- RTS. However, the current RS232 cards are wired like a modem, so the wires
- that we will use are properly called DSR and CTS. You need not understand this
- peculiarity of the RS232 cards.
-
- In order to fully explain the modification we are about to make to your card, a
- little hardware detail will be presented. In the TI RS232, TI used certain
- Communication Register Bits to control the functionality of their card. Here
- are the TI definitions as compared to current and added definitions on the
- Myarc:
-
- Bit # Function Myarc
- 0 DSR ROM page Bit, 1=active Same
- 1 PIO Port Mode Control, 1=Input STROBE
- 2 PIO Output "STROBE" bit Mode Control
- 3 Spare PIO output strobe LED, 0=On
- 4 Flag Bit, 1=Set DSR (*)
- 5 CTS - control, Primary RS232 port, 0=Active CTS 1 (+)
- 6 CTS - control, Secondary RS232 port CTS 2 (+)
- 7 LED Control, 1=ON spare
-
- (*) - This pin's usage is NEW to all three cards, and it can be used to hang
- up a modem by toggling the modem DTR line. Some terminal emulators and some
- BBS software packages connect the secondary CTS line to the modem DTR line
- to implement this function.
-
- (+) - These are the flow control lines new to the Myarc card.
-
- Those terminal emulators and BBS software packages that connect the secondary
- CTS line to the modem DTR line, do not work with Myarc cards, because the CTS
- line is in-operative as supplied by Myarc. We will fix that.
-
- ENHANCEMENT ( Working Directions! )
-
- The first thing you will need to do is run down to your local Radio Shack and
- pick up part number 276-2520, its a MC1488. ( FYI - its mate, the MC1489, is
- also available as part number 276-2521. They are both listed as costing $1.29 a
- piece in the '94 catalog.) While you are there you may want to pickup some
- wire-wrap wire (278-501,502 or 503 ) and a wire-wrap wrapper/stripper
- (276-1570) -- the stripper part is hidden in the handle! In fact, you can pull
- the wrapper portion out of the handle and stick it on cordless screw driver and
- make an auto-wrap tool!
-
- Ok, if you have a soldering iron and solder we are good to go.....
-
- Step 1.
- Take the cover off.
-
- Step 2.
- Orient the board so that you are looking down at the chips and the edge
- connector is facing you. Now remove the 3 resistors in the top right-hand
- corner. You now have six holes where the resistors use to be, fill the three on
- the left-hand side with solder. Make sure the holes on the right-hand side are
- clear, because you will be sliding jumper wires through them.
-
- It will look something like this....
-
- 1 * * 4
- 2 * * 5
- 3 * * 6
-
- ___ ___
- 1 =| U |= 14
- 2 =| |= 13
- 3 =| 1 |= 12
- 4 =| 4 |= 11
- 5 =| 8 |= 10
- 6 =| 8 |= 09
- 7 =|_____|= 08
-
- Step 3.
- Take out your new 1488 and piggy-back it to the existing 1488 by soldering pins
- 1, 7 and 14 together ( if this chip is socketed, please remove it from the
- socket before piggy backing it ). Next bend up the unsoldered pins.
-
- Step 4.
- You will need three short and three long jumper wires.
-
- Solder a short jumper wire from solder hole 4 to pin 11 of the piggy-backed
- 1488. Solder another short jumper wire from solder hole 5 to pin 6 of the
- piggy-backed 1488. Solder the final short jumper wire from solder hole 6 to pin
- 8 of the piggy-backed 1488.
-
- Now for the long jumpers.
-
- Solder pins 4 & 5 of the piggy backed 1488 together. Run a jumper wire from
- that connection through solder hole 2. On the back side connect this to pin 11
- of the 74LS259 ( which is the farthest chip away from the 1488 on the top row).
- Note: Since you are now working on the backside of the board, pin numbering
- is reversed, so the 259 we are talking about is numbered like this:
- ___ ___
- 16 =| U |= 1
- 15 =| |= 2
- 14 =| 7 |= 3
- 13 =| 4 |= 4
- 12 =| 2 |= 5
- 11 =| 5 |= 6
- 10 =| 9 |= 7
- 09 =|_____|= 8
-
- Solder pins 9 & 10 of the piggy-backed 1488 together. Run a jumper wire from
- that connection through solder hole 3, on the back side connect this to 09 of
- the 74259.
-
- Solder pins 12 & 13 of the piggy-backed 1488 together. Run a jumper wire from
- that connection through solder hole 1 ( now the only one remaining ). On the
- backside connect this to pin 10 of the 74259.
-
- OK, that's it for the hardware mods. Double-check everything. Tape down the
- three long jumper wires on the back and put the case on. You have now added
- three more control lines to the RS232 port that you can use to implement
- hardware flow control in your software.
-
- Here are the assembler instructions to manipulate these three lines:
-
- LI R12,>1300 CRU base of RS232 card 1
- SBZ 4 activate DSR
- SBZ 5 activate primary CTS
- SBZ 6 activate secondary CTS
- SBO 4 de-activate DSR
- SBO 5 de-activate primary CTS
- SBO 6 de-activate secondary CTS
-
- CRU bit 7 is left as a spare. There is also a spare line driver on the MC1488.
- We could attach pin 12 of the 74LS259 to pin 2 of the MC1488, then run a wire
- from pin 3 of the 1488 to an otherwise unused pin on the 25-pin RS232
- connector. Another option would be to use CRU bit 7 for another control signal
- out the parallel port (without using the 1488). Right now we are happy to have
- "fixed" the MYARC RS232.
-
- About the only thing we have not discussed in this article is how to change
- the Myarc card from RS232/1&2 to RS232/3&4. This will be explained later in
- a user note.
-
- Many people have asked us where can they buy hard to come by 99XX chips ( such
- as the 9902A's used in the RS232). There are two routes to go. One not so sure,
- but very cheap, the other guaranteed to have what you need, but a little on the
- pricey side.
-
- The cheap route: look in your local phone book for computer scrap or salvage
- people. They usually have tons of 99XX chips that they will be glad to part
- with at a fair price.
-
- The more expensive route is to call Newark Electronics at 1.312.784.5100. These
- people should be able to tell you the number for your local Newark office ( or
- just look in the phone book under electronics ). They have 9901's, 9902's, and
- a few others.
-
- L.D.O.M. 03.26.94
-
-
- ============================================================================
- DTIHM021
-
- 39139 8JUN93-2122 General Information
- RE: SKEW (Re: Msg 39135)
- From: JHWHITE To: JERRYC
-
- Jerry, I still think this needs to be clarified a bit further, especially
- your definition of rotational delay. I can live with the definition of skew,
- since it is rather simple to visualize and is what HyperCopy reports.
-
- What bothers me about the definition of rotational delay is that it assumes
- the disk will rotate past the index hole after stepping from any track to the
- next. Assume the following is the logical sector pattern for two tracks of
- a disk:
-
- 0 1 2 3 4 5 6 7 8 <-- physical sectors
-
- o 8 4 0 5 1 6 2 7 3
-
- o 5 1 6 2 7 3 8 4 0
-
- The interlace is 2, and the skew is 6. The rotational delay stepping from
- the first track after reading its last LOGICAL sector to the next track and
- the availability of its logical zero sector is the time it takes to pass
- over physical sectors 1 through 7. This is 7 sectors.
-
- A single density TI disk can have approximately 25,000 bits of information,
- or 3,125 bytes per track. Seven 256-byte sectors is 1,792 bytes plus the
- gap bytes. The rotational delay takes over 100ms during the step.
-
- Therefore, if 35ms is the optimum rotational delay for this disk, there should
- be over 60ms for the disk controller to re-synchronize to the second track
- without passing the last physical sector or the gap information preceding and
- following the index pulse.
-
- Jeff
-
- -*-
- =============================================================================
- DTIHM022
-
- 46809 7JUN95-2243 9640 GENEVE
- RE: Three and a half inch drives (Re: Msg 46798)
- From: JHWHITE To: JCARVER
-
- John, maybe I can explain it simply. The Geneve will boot from an 80-track
- disk in an 80-track drive with any controller. This includes the TI floppy
- controller, but you are limited to single density.
-
- Once MDOS is loaded, it defaults to how the controller would work on the
- 99/4A. In most cases, this would make MDOS treat the drives as 40-track.
- Unfortunately, in sector 0 of the disk, it is marked as being 80-track.
- This is not so bad, I suppose, if the OS -- that is, MDOS -- can be set
- to treat the drive as 80-track.
-
- It just so happens that if MDOS ignores the tracks-per-side value stored
- on the disk except when the drive is considered 80-track, the first 40
- tracks on side 0 of the disk can be treated as the entire side of the
- "imagined" 40-track disk.
-
- Sector 1 of the disk holds the file descriptor index records, and these
- are actual sector number values. Therefore, read operations of files
- that completely fit within the first 40 tracks of side 0 are accessible
- (I think) just as if they were on a 40-track disk.
-
- So AUTOEXEC and SETDSK can be at the beginning of the disk to force MDOS
- to 80-track drive operation. If SETDSK is not used, the 80-track disk
- would be corrupted by writing to it.
-
- This is because the bitmap in sector 0 -- not used during most read
- operations -- for a 720K disk marks allocation units consisting of
- 2 sectors each. Each time an 80-track disk bitmap were updated as
- if it were 40-track, additional sectors would be marked as used.
-
- If we compare the logical sector layout of a 40-track disk to an 80-track
- disk, we can see the logical overlap:
-
- 40-track 80-track
- Side 0 0-719 0-719
- ----- 720-1439
- Side 1 ----- 1440-2159
- 720-1439 2160-2879
-
- Getting less murky now. Whether MDOS thinks the drive is 80-track or
- not, it will translate sectors 0-719 as an access to side 0 of the disk
- in the first 40 tracks. Sectors 720-1439 would not be found, because
- MDOS would look on the wrong side of the disk for them -- in the area
- reserved for sectors 2160-2879.
-
- This is because sectors count up on side 0 as the read/write heads move
- toward the hub, and ALSO count up on side 1 as the read/write heads move
- away from the hub.
-
- Looking at the physical overlap of the sectors, we have the following:
-
- 40-track 80-track
- Side 0 0-359 0-719
- 360-719 720-1439
- Side 1 720-1079 1440-2159
- 1080-1440 2160-2879
-
- The drive logic always treats the outer (largest concentric) track as
- track 0. On a 40-track disk, side 1, moving the head to track 39 (the
- 40th track) finds sector 720. On an 80-track disk, side 1, moving the
- head to track 39 finds sector 2160.
-
- If this has not made your head spin faster than your floppies (300rpm
- in most cases, 360rpm for 1.2 Meg 5.25" and single density 77 track
- 8"), what happens when you format a disk in an 80-track drive when
- your software treats it as 40-trac? It makes it logically look like
- a 40-track disk (whilst in an 80-track drive running 40-track software).
- In this case, the physical overlap is:
-
- 40-track 80-track
- Side 0 0-359 0-719
- 360-719 -----
- Side 1 720-1079 -----
- 1080-1440 720-1440
-
- Now I am beginning to think of onion slices and at least 4 food colorings
- to bring this discussion to yet another level....
-
- Thankfully, I was taught not to play with my food. And disk formats are
- certainly nothing to cry over -- unless of course it is an accidental
- format of the disk holding valuable data.
-
- Jeff White
-
- -*-
-
- ==========================================================================
-
- DTIHM023
-
- Disk Controllers -- an Addendum March, 1987
- By Jerry Coffey
-
-
- I mentioned a "turbo" modification to lock out the "read after write"
- (write verify) routine usually performed by the controller. Here are
- the details:
- Find the 74LS251 chip at the top center of the controller board,
- above the DIP switches and beside the large FDC chip (marked WD1770).
- Solder a wire from the number 2 pin of the 74LS251 through a switch to
- ground (e.g. the wide trace of the DIP switches or any trace connected
- to that wide trace). It looks about like this from the bottom (non-
- component side) of the board.
-
- | ______________________ _______
- | / Switch to ground
- | .|......
- top | -------- ---- ^
- of | | | |DIP | |
- Myarc | > | |swch| Location of the
- contrlr | |74LS251 | | | switch is up to you
- board-->| -------- ----
- |
- | -----------------
- | | |
- | | |
- | | |
- | > WD 1770 |
- | | |
- | | (or 1772) |
- | | |
- | -----------------
- |
-
- As always you proceed at your own risk. (One person has told me this
- did not work om his 40 track system, but I haven't verified that.) You
- can tell it is working if your controller writes as fast as it reads
- (normally the write takes twice as long).
-
- Since I wrote the article on disk controllers, I have discovered some
- surprising facts about my own system. All of the Myarc timings in the
- article were done on an 80 track system with the fast WD1772 controller
- chip (stepping at 2ms). With some help from Paul Charlton and Richard
- Roseen, I recently customized Paul's Eprom to step at 3ms using the
- WD1772. (Richard's drives were making errors at the faster speed.) I
- used a Mechatronics Eprom programmer to download the Eprom code to
- disk, changed the FDC commands with a sector editor, and wrote the
- altered code back to a fresh Eprom. The process is simple (and cheap)
- once you decide what code you need in the Eprom.
-
-
-
- The slower step speed made it possible to notice some slight
- differences in the performance of the WD1772. The first thing I
- noticed was that interlace 4 on 18 sector tracks was no longer smooth
- -- it was missing the first sector after a track seek and forcing an
- extra revolution of the disk. This was the first clear indication of
- how close this format is to the "ragged edge". The reaction to the
- small change in step speed implies that this interlace comes within 5%
- of the minimum time required to step and settle the head. Thus the
- likelihood of read/write errors is relatively high with this interlace.
- It will occasionally detect the sector ID and begin to read or write
- before the head has completely settled. This interlace should
- definitely be avoided -- 18/3 is both faster and more reliable.
-
-
-
- The Eprom modification itself was an interesting experience. I patched
- the new FDC commands into some unused text bytes and patched addresses
- into the code to point to the new locations. The Mechatronics Eprom
- Programmer is an excellent piece of equipment. It will burn (program)
- a 2764 (8k) in about 90 seconds using the fast algorithm. I have
- talked to Jim Horn and Jeff Guide about offering an Eprom service to
- the customers of Disk Only Software. There are many possibilities this
- technique opens up. There is the 80 track modification for the TI
- controller worked out by Andy Cooper. And many Myarc owners are still
- using old Eproms that have never been upgraded (though this situation
- has improved since Lou Phillips increased his production capacity).
- The fix we developed for Richard's controller can provide the optimum
- step speed (3ms or 5ms) for different disk drives using the WD1772 FDC
- chip. And any enterprising programmer can get his tailor-made code
- installed in nonvolatile memory.
-
- Jerry Coffey [74716,3525]
-
- ============================================================================
- DTIHM24
-
- A Hard Drive Odessey (Oddity)
- By Dan H. Eicher
- & Jeffrey H. White
-
- Recently I put a one gigabyte SCSI drive on my pc. (A personal note: if you are
- going to use SCSI on a PC, buy an Adaptec brand controller.) This left me with
- two Seagate ST277R hard drives that had performed five years of great service.
-
- About this time, Jeff and I were assembling a system to work on the GenMod
- Geneve / WHT SCSI compatibility problem. Of course I needed two external cases
- to hold these drives. The best place I found for getting external cases with
- power supplies is Mendelson's Electronics: 1-800-344-4465. Their supply is hit
- and miss, but they usually have something usable at a very reasonable price.
-
- I got my cases in and built the cables. While you can still buy RLL controller
- cables - which are usable with the Myarc HFDC - usually the length is wrong so
- you will need to build your own. You can buy the parts you need to build the
- cables from JDR Micro Devices:
-
- IDE34 - 1 to hook to the HFDC plus an additional connector for each HD.
-
- IDE20 -\ These are the data cable. 1 each for every hard drive.
- IDS20 -/
-
- IDS16 - This is the TI side of a printer cable.
- IDCEN36 - This is the Printer side of a printer cable.
-
- To crimp these cables you will need a vice ( if you go this route, you need to
- be very careful ) or buy a cable crimper. JDR's part number is HT-214 and is
- well worth the money.
-
- We got the hardware assembled and now it was time to reformat the hard drives
- to work on the TI. We dug out our specifications on the drive ( I still have my
- orginal owners manual ) and put the values into MDMV. We had to guess at the
- interlace value for the HFDC/Seagate 277R drives and GenMod geneve combination.
- After the formatting was finished, the drives could be read, but not written
- to. We tried over and over with different MDMV settings. None of them seemed to
- work. In a moment of desperation I tried using CFORM; I had the same luck as
- MDMV.
-
- In order to save myself some time, I decided to try only formatting the first
- 10 cylinders in my quest for a working (not optimal, but working) interleave.
-
- Well after trying this little stunt, CFORM came back and told us that track 0
- or media on this device was BAD! Yegads! After this error message we could not
- coax another complete format out of either MDMV or CFORM.
-
- Our last resort, and it was a last resort, was to put together a PC system with
- an RLL controller. Fortunately, Jeff owns an original Seagate brand RLL
- controller. Immediately, the Seagate controller recognized the drive and type.
- It made quick work of the formatting of these drives.
-
- We moved the drives back over to the GenMod Geneve system and this time the
- reformatting went without a hitch. I could read and write data with no
- problems. In fact, the drives seemed to work much quicker than similar drives
- we have in house.
-
- Later we went up to Chicago and asked Mike Maksimik what he thought my have
- went wrong. He told us that probably the gap value between sectors was too
- small for the drive - that is, a bug in CForm.
-
- He knew how to fix the problem, but apparently there is a disagreement between
- Mike and Don Walden regarding royalty payments, so no fix will be forthcoming
- from Mike.
-
- We asked Mike why CForm could not just go in and redo the gap values, like the
- Seagate controller did. Mike says that this a bug in the 9234 controller chip
- used in the HFDC. In simplistic terms, the chip must read this value before
- changing it. If the value is wrong an error is returned. The chip should then
- disregard the error, and reformat with the correct value. The 9234 has a fatal
- bug, that if an error occurs during this process the chip locks up. There
- unfortunately is no way to work around this problem in software.
-
- This is the reason why occasionally a hard drive will become so messed up on a
- TI, the only recourse is to take it to a PC and do a low level format with an
- RLL or MFM controller card.
-
- A few notes: We have found that RLL drives seems to work fine with the Myarc
- HFDC. You should always attempt to use the buffered head step (0) in the MDMV
- menu. You should avoid using CForm, and only use MDMV on the Geneve to format
- drives. Of course to load MDMV and use the format routine on a Geneve you must
- page in the ROM.
-
- Using RomPage means that the Geneve's Master DSR is paged out, so the only
- devices you have access to are drives connected to the HFDC and/or those
- connected to a Myarc floppy controller. It is much easier just to hook up a TI
- and format the hard drives and then use them on the Geneve.
-
- If you want to load MDMV on a Geneve to format with and you need the Rom Paged
- in the easiest way is to go into TI BASIC, issue a CALL INIT, CALL
- LOAD(-32766,186), NEW, and then do a CALL MDM.
-
- Also when purchasing connectors to build your cables, always buy high quality,
- gold-plated, double-leafed connectors.
-
- While moving MDOS source code around and testing the GenMod Geneve and WHT SCSI
- card we have found the Syquest EZ135 to be very reliable. It works as fast as
- all but the fastest SCSI hard drives on the Geneve, offers removable media of
- 135 Megs and can be set at any SCSI ID. The Syquest drive is the perfect
- companion for a WHT SCSI card. We have also played a bit with the Iomega SCSI
- Zip drive. It is a MUCH less reliable unit, it is locked into SCSI ID's 5 and 6
- which are incompatable with MDOS. MDOS wants to see all hard drives at ID's 0,
- 1 and 2.
-
- Global Computer Products has a sale on SyQuest EZ135 for 179 dollars, part
- number GDC92225E, the phone number is 1-800-845-6225.
-
- L.D.O.M. 05.01.96
- ============================================================================
- DTIHM25
-
- The 9224: A failed experiment or an educational experience?
- by Dan H. Eicher, eicher@delphi.com
- and Jeffrey H. White, jhwhite@delphi.com
-
- About three years ago Beery Miller was working full bore on trying to
- implement the level 2 routines for the Myarc Hard Floppy Disk Controller
- (HFDC) in MDOS. He was having some problems so he called Standard
- Microsystems, the people that make the disk controller chip in the Myarc
- HFDC. At that time the support engineer he was talking to told him that
- the 9234 was a buggy chip - somewhat experimental. He recommended a
- complete redesign of the controller board to use a then newer chip that
- would support the then current RLL hard drives.
-
- This not being possible, he recommended the possible retro-fitting of
- the Standard Microsystems 9224 disk controller chip which appeared to be
- pin for pin and register level compatible with the currently in-use 9234.
- Beery said the only difference mentioned to him by the support engineer was
- that the 9224 and the 9234 computed their ECC value differently. Meaning
- that a hard drive used on one chip could not be used on the other with out
- reformatting.
-
- Beery got in a couple of the 9224 chips to test. He tried one of the chips
- in his HFDC. At that time he didn't have a spare hard drive and no easy
- way to back up his system. After placing a 9224 in his HFDC he found that
- he could no longer read his hard drive. His experimentation with the 9224
- stopped there.
-
- About two years latter, Jeff and I got a couple of 9224 from
- Standard Mircosystems. It says in their component catalog (1988 version)
- that these chips were designed to be used in Vaxes and Microvaxes,
- sometimes called Vaxen.
-
- Another year or so went by until we got a spare HFDC and hard drives to
- try some experimentation. Neither of us were willing to risk doing
- experiments on our only HFDC, they being very temperamental and all.
- Jerry Coffey was kind enough to loan us an HFDC to do some testing with.
-
- Now, with all that preamble, we finally got around to doing the experiments.
-
- I set the HFDC at CRU >1000 thinking that that would be a good CRU
- setting, allowing us to use DSK1 emulation even if, later on, we
- decided to add floppy-only controller.
-
- We hooked everything up and the floppy drives were chattering and doing
- all sorts of weird things...
-
- This, the first of a long series of problems, was caused by a CRU
- conflict between the HFDC and the Myarc 512K card we were using. The Myarc
- 512K card responds at CRU >1000 (and >1900).
-
- LESSON: Make sure your HFDC is not set at a CRU-base that conflicts with
- another expansion card in your system.
-
- To solve this problem, I needed to change the HFDC's CRU address to >1100
- so that there would be no conflict with the Myarc 512K card. To verify that
- the card was set to the correct CRU I used the Minimem module.
-
- Here is the procedure I used to verify that the HFDC was showing up at the
- CRU >1100 space. I selected Minimem, then I selected Easy Bug. I typed
- C1100 <space> then 1, hit <return>, then the period key. This activated the
- card. Now its DSR memory should show up starting at >4000. So I typed
- M4000 and hit <return>. Easy Bug then responded back with the hex values
- held at the address starting at >4000. These values should be:
-
- >4000 AA
- >4001 OB
-
- The >AA means that this is a valid DSR. The >0B is the revision of the
- DSR. The current working revision is 11. A version 12 DSR was distributed,
- but it was found to be more buggy then version 11!
-
- With the HFDC's CRU set up correctly, it was time to hook the hard drives
- back up and see what would happen. Still the same problem...floppy drive
- chatter... argh...
-
- OK. Next step was to make another quick visual inspection of the card.
- Quickly I noticed a problem. The part of the card that sticks out past
- the end of the P-box did not have any electrical tape. Myarc made an
- engineering blunder. They had ran control lines from the AM26LS32x chip
- to the hard drives on a portion of the card that is scraped by the metal
- clips of the P-box.
-
- LESSON: Make sure the neck of the HFDC is protected with tape.
-
- This was easy to fix with a little electrical tape around the neck, and we
- were ready to go again. We tried again. Same Result. Jeff noticed that the
- card had an AM26LS32PC. He has had some problems with this chip in the
- past. This version of the chip is a marginal component. The recommended
- replacement is a AM26LS32AC. We didn't have one of those so we tried
- omething else. Note: the AM in the part number signifies an AMD part
- number.
-
- LESSON: If your system is acting quirky - replace the AM26LS32PC with an
- AM26LS32AC.
-
- We disconnected the hard drives from the HFDC. The system powered up
- but wouldn't access floppy drives. Oops! I had forgotten about the 45 second
- delay, while the HFDC repeadedly waits for a hard drive to activate its ready
- line.
-
- After waiting for the controller to time out, I could access the floppy
- drives fine.
-
- To defeat this power-up timer you must take pin 1 of the inner most LS251
- (U21) to ground, pin 8 works well for this, and you may want to put this
- on a toggle switch. - This information courtesy of Tim A. Tesch.
-
- LESSON: Either jumper your card to bypass the hard drive power-up wait timer
- or wait 45 seconds.
-
- All we had to do now was hook up the hard drives and test things out.
- More floppy drive chattering and then no access to the floppy or the hard
- drives.
-
- At this point, I was nagging Jeff to come up with more ideas. He decided
- to offer his HFDC for sacrifice. No, he did not torch it -- it does a good
- enough job toasting itself while in the P-box. Jeff swapped his with the
- HFDC from our test system -- the HFDC Jerry had sent us. The alternative
- was to take the hard drives from his Geneve and try them with Jerry's HFDC.
-
- Too risky. The data on the hard drives is worth more than the controller.
-
- Same symptoms. Had Jeff's HFDC been fried? Jeff then decided to bring his
- hard drive to the test system with his HFDC. With Jeff's HFDC and hard
- drive, the system worked fine. Jeff then tried his hard drive with the
- HFDC Jerry had sent. This combination worked as well.
-
- Using Jeff's known working set of cables, we were able to format one of
- the hard drives we had for testing.
-
- We decided to try something new. We swapped our test cables one at a time
- with Jeff's known working cables until we determined the original problem
- was with the control cable - the cable with 34 pins. ( The other cable
- is called the data cable. ) I checked out this cable with a voltmeter
- and everything appeared fine.
-
- Theorizing that it might be a problem with the length - it was about 6
- feet long - I cut the cable in half and applied another connector (Radio
- Shack part number 276-1564). We tried it with this now shortened
- cable with a new connector and we still had the same problems!
-
- We then sat down and checked each pin on the cable for continuity - the
- size had been reduced to half the previous length and the pins rechecked.
- But STILL no difference. Then, Jeff got a bright idea. He reversed the
- cable, not just rotating the cable 180 degrees on one end or the other,
- but a 180 degree turn on both end! What we were using as pin 1, now become
- pin 34 and what was pin 34 became pin 1. This time the system fired up without
- any drive chattering.
-
- How could reversing the cable make a difference on a cable with
- straight through connections? Well on the connector - all odd number pins
- are used for ground and all even numbered pins are used for controller
- signals. Our theory is that one of the strands in the ribbon cable had a
- crack in it, causing high impedence, but only when it was twisted a
- certain way. This strand when connected the orginal way was on an
- EVEN-numbered pin (i.e., a control signal), when the cable was reversed it
- placed the bad strand on a ground line. Having one bad ground out of 17
- ommon grounds didn't cause a problem.
-
- LESSON: Always suspect cables. Always have a spare set of known good working
- cables on hand.
-
- With the system working we formatted both hard and floppy drives
- without problems. We pulled the HFDC and put in the 9224. The first thing
- we noticed was terrible drive chattering. We thought this might be because
- of the slower step rates of the 9224 as compared to those of the 9234. We
- tried various dip switch settings on the HFDC, but were not able to get the
- floppies working. We changed the HFDC's CRU setting to 1200, inserted a
- Corcomp disk controller and went on.
-
- The next test was to try to access a hard drive previously formatted with
- the 9234. Neither hard drive could be read. We (and Beery) expected that
- this would happen since the two controller chips compute their ECC codes
- differently. We had also hoped that Beery's theory was correct that if
- you reformatted a hard drive with the 9224 that it would be usable.
- Well, despite many attempts (including upgrading the static memory on
- the HFDC from its factory default of 8K (6264) to the full 32K (62256))
- we were never able to format a hard drive with the 9224 controller chip.
-
- LESSON: Always have the full 32K of memory on your HFDC.
-
- After exhausting all possible hardware options, it would appear that
- without modification to the existing Device Service Routine software,
- that the 9224 Hard Floppy Disk Controller Chip is not usable on the HFDC.
-
- Other things that you can do to help make this temperamental piece of
- equipment more robust is to make sure the 26LS32 is an AM26LS32AC. You
- should also verify that the 9216 chip is a 9216B - this chip is the data
- separator. The 9216B is specified for faster data throughput. The 9216
- is overclocked at 8 MHz, but it may work fine for double density disks.
-
- In order to use high density floppies or tape backup devices, you must
- use the 9216B. I have a hand full available for five dollars each ( includes
- shipping ). You should also add heat sinks to the two 7805 voltage
- regulators. A good cleaning with an eraser tip should also be done,
- if you notice any dirt on either the P-Box edge connector or hard drive
- control cable connector - the silver looking connector. This silver
- connector is coated with a tin-lead compond and does not provide a real
- good connection - like gold platting would.
-
- L.D.O.M. 12.19.95
-
- =============================================================================
- DTIHM26
-
- Fixing Blown Bit Maps on the HFDC
- by Edward Hallett
-
- From: The Catus Patch BBS
-
- 11/10/90
- By: TOM WILLS 1 (TUCSON AZ)
- To: ALL
- Sb: HD DIRECTORY FIX
- I was asked if I knew of a way to copy all the files off an HD on the TI which
- has bad directories. The directories are not totally blown, just a few entries.
- And, of course, MDM will not read those directories. Any ideas on this one?
- Also, not all directories are bad, just some. The MDM backup will not work
- because of this, nor can he copy the files from the subdirectories which have
- bad pointers in them. In other words, HELP!
-
- By: EDWARD HALLETT 6 (TUCSON AZ)
- To: TOM WILLS 1 (TUCSON AZ)
- Sb: HD DIRECTORY FIX
-
- Tom, I have had to deal with blown diries and or blown file headers on both
- Ida's and my harddisks on several different occasions. The vast majority of the
- files can be salvaged in most cases. The range of difficulty will depend upon th
- number of blown sectors, their location and the size of the hard disk. Files for
- which a backup copy exists on floppy do not need to be recovered but only need
- to have their blown pointers removed so that the other files can be copied off
- the hard disk. Files that do not have a backup on floppy need to have their
- headers, pointers, directories etc. repaired so that they can be salvaged by
- copying them off the hard disk. I use a program called Hard Master by Asgard
- Software I think, when I need to fix a hard disk. The Hard Master program is
- similar to the SectorOne program but I like Hard Master better. It is a hard
- and floppy sector editor with a Tree function, Map function, and much more. Its
- docs also explain alot about the hard disk sector mapping etc. As far as
- procedure to fix the hard disk I would suggest the following as a general
- procedure.
-
- 1. Run the hard disk test with MDM5. this will mark any bad sectors. Note the
- number of bad sectors found and their approximate location on the hard disk. Are
- they all at the begining of the disk, some in the middle etc.?
-
- 2. If any bad sectors were identified during the test try to identify the exact
- sector numbers by using Hard Master to step thru the sectors in the suspected
- area with its sector read function.
-
- 3. Using Hard Masters Tree function print out a tree listing of the directories
- only. If a bad sector is a directory sector you will have to remove the pointer
- to that directory to get to the rest of the directories.
-
- 4. Using the Tree Function after removing any pointers that were causing
- trouble print out a tree listing of both directories and files. These tree
- listings tell you what sors the headers are in and what sectors the file act-
- ually occupies. You may hit some bad pointers during the file tree listing and
- they will have to be removed before you can get the listing to complete as in
- the directory tree listing.
-
- 5. At this point you should have a detailed tree listing of both directories and
- files and a list of bad sector numbers. You would also have recorded any
- information about the pointers you may have removed. With the bad pointers
- removed and the bad sectors marked you should now be able to copy the remaining
- files from the hard disk to floppies. I would recommend doing this file by file
- rather than with the back up routine. Of course you only need to copy the files
- that you don't already have backup copies.
-
- 6. At this point you are ready to rebuild the pointers for the directories and
- or files that you had to remove to get the other files off the hard disk. If the
- directory or file header was located in what is now a bad sector just pick an
- unused sector at the top of the hard disk and write your new header block there.
- then put the pointer in any good directory or the root to point to the new
- header. Once this is done you can simply copy the file otire directory off
- to floppy. If the directory or file header was just scrambled and not in a now
- bad sector you can rebuild it where it is.
-
- 7. Using this procedure you can recover all the files from the hard disk with
- the exception of a file that now has a bad sector in the middle of the file. In
- that case you must change the header to skip that sector. Sort of like
- fracturing your own file. Then you will have recovered the file minus one
- sector. Reconstructing that sector may or may not be possible depending on the
- file, (data, text, program etc.).
-
- Now that is the basic procedure and it has worked very well for me. The
- specifics of removing pointers, rebuilding headers etc. is similar to those on
- floppies. The information needed to do this is available in the HFDC manual and
- in the Hard Master manual. The specifics also depend upon the actual problems
- with the specific hard disk. The persons' experience with working with floppy
- headers, their ability to work with hexadecimal math and their ability to
- multiply alot of the hexidecimal pointers by an offset
- constant to get the actual sector number (this can be confusing). If you try to
- read a bad sector and get a device error you will probably have to rerun the
- Hard Master program in order to continue reading sectors. (Does not recover well
- from device error ie bad sector). I had to tell if to switch from HD#1 to HD#2
- and then back to HD#1 to recover from error and continue. You may also
- experience similar problems with other sector programs and MDM5. So it is
- iportant to identify those bad sectors and make sure your software is
- functioning correctly after a device error before attempting to write to the
- hard disk (sector write or file copy) or yould just make things worse! When
- in doubt reboot or rerun before writing. You didn't say if this hard disk was on
- a 4A or a 9640 but the procedure is the same. Give me a call land line if you
- need more info. I would be glad to help.
-
- I'd be glad to tell you about some of the specific problems that I have had to
- repair on hard disks. Once the hard disk is restored to normal ie fixed the bad
- directory and files, copied everything off, reformatted, copy everything back
- on, you can make it easier for future recoveries by copying sectors 0 thru 1 to
- sectors 20 thru 39 (HEX of course). This gives you a copy of all the directory
- information and can be used to restore the directories to the state they were in
- at the time this info was copied. Also helpful is to print out a tree listing
- of all directories and files showing their sector locations etc. And of course
- doing regular backups of the hard disk would be very useful! I think that
- almost any hard disk could be recovered with theurse) and start
- rebuilding directory headers! Well give me a call if I can be of any additional
- help. Or if you need more info about Hard disks. If I can make it to the SIG
- I'll try to remember to bring Hard Master also for a little demo and we can
- print out a Tree listing for your hard disk just in case you ever need it.
-
- =============================================================================
- DTIHM027
-
- CPUID & VDPID
- by Jeff White
-
-
- 40176 2SEP93-2117 Communications
- RE: PC99 and TELCO (Re: Msg 40175)
- From: JHWHITE To: MARKVC
-
- To clarify that a bit, V14 is used to change the 16K page of VRAM used by the
- V9938/V9958. If data is written to page 0, which is all that exists on the
- stock 99/4A, and the page is changed (only possible with V9938/V9958), the
- data will not be there. However, since the page does not change on the
- 9918A, the data will be found. The 9918A may mask V14 to V6, and V6 sets
- the sprite generator table base address. Because sprites are inactive in
- the text modes which Telco uses, changes to V6 do not affect the video
- display.
-
- I have a more innocuous routine, called VDPID, that works on a different
- principle. The only side-effect is that the text mode and background colors
- are changed, but the routine does change them to what the programmer gives
- the routine.
-
- Jeff
-
- -*-
-
- ---------------------------------------------------------------------------
-
- *
- *
- *
- * CPU identification routine by Jeffrey H. White
- * (c) Copyright 1991
- *
- * Usage: BLWP @CPUID
- *
- * Returned values in R1: if 9900, = 1
- * if 9995, = 2
- * if 99000, = 3 (Privileged Mode)
- * = 4 (User Mode)
- *
- CPUID DATA $-16 R8 location
- DATA CPUPC R9 location
- CPUPC BES 12 skip over R10-R15
- LIMI 0 try to turn off interrupts
- LWPI CPUID-16-6 to preserve R13-R15, new Rx = old R(x-3)
- STST R15 store status
- SLA R15,12 are interrupts off
- JNE C99000 no, then definitely in 99000 User Mode
- STWP R13 store current WP
- LI R14,CONTIN trick with PC required by LST-less 9900
- LI R15,>0020 after RTWP, ST10 will be 1 only on 9995/99000
- RTWP load ST, keep current WP, and execute next
- CONTIN LI R14,>0001 load value to return if 9900
- STST R15 ST10 was not affected by previous instruction
- SLA R15,7 check ST7 for Privileged (Supervisor) Mode
- JLT C99000 ST7=1 always on 99000 in User Mode
- JEQ C9900 ST10=0 always on 9900
- MOV @>FFFA,R15 9995 on-chip decrementer location
- AI R15,>8000 most distant value from decrementer
- MOVB R15,@>FFFB byte writes to 9995 decrementer mess up both
- AI R15,>8000 restore register to previous decrementer value
- CB R15,@>FFFA decrementing is not fast enough for bytes to equal
- JNE C9995 on 99000, memory or not, >FFFA will not change
- INC R14 only executes if 99000 is found
- C9995 INC R14 only incremented once if 9995
- MOV R15,@>FFFA restore the value
- C9900 LWPI CPUID-16 restore entry WP
- MOV R11,@>0002(R13) put at caller R1
- RTWP finished
- C99000 LI R14,>0004 value returned if 99000 User Mode
- JMP C9900 go exit
-
- ------------------------------------------------------------------------------
-
- *
- * VDP identification routine by Jeffrey H. White
- * (c) Copyright 1991
- *
- * Usage: BLWP @VDPID
- *
- * Returned values in R1: if 9918A, = 1
- * if V9938, = 2
- * if V9958, = 3
- *
- VDPWS BSS 32
- VDPID DATA VDPWS
- DATA VDPPC
- VDPPC LI R10,1
- LI R0,>0F04
- BLWP @VWTR
- VDPST MOVB @VDPSTA,R12
- JGT VDPST
- JEQ V9918A
- MOVB @VDPSTA,R12
- JLT V99X8
- JMP V9918A
- V99X8 LI R0,>0F01
- BLWP @VWTR
- MOVB @VDPSTA,R12
- SLA R12,5
- JLT V9958
- JMP V9938
- V9958 INC R10
- V9938 INC R10
- V9918A LI R0,>0F00
- BLWP @VWTR
- LI R0,>07F4
- BLWP @VWTR
- MOV R10,@>0002(R13)
- RTWP
- *
- *
- ===========================================================================
- DTIHM028
-
- 40312 10SEP93-1251 Graphics
- bitmap mode explained again
- From: JHWHITE To: ALL
-
-
- In article <1993Sep8.013025.4524@ultb.isc.rit.edu>, digger@ritcsh.csh.rit.edu
- (Sean McGranaghan) writes:
- >
- > VDP Register Value Result
- > ------------- ----- -------------------------------------
- > r0 >02 Set Mode bit 3 for bitmaped mode
- >
- > r1 >E0 default value
- >
- > r2 >06 Screen image table base address
- > >06 * >400 = >1800
- >
- > r3 >80 Color table base address
- > >80 * >40 = >2000
- >
- > r4 >00 Pattern descriptor table base address
- > >00 * >800 = >0000
- >
- > r5 >36 Sprite attribute list base address
- > >36 * >80 = >1B00
- >
- > r6 >07 Sprite descriptor table base address
- > >07 * >800 = >3800
- >
- > r7 >07 default value
- >
- >
- > All of this should lead to VDP memory set up as follows:
- >
- > VDP Address Table Name Length
- > ----------- ---------- ------
- > >0000 - >17FF Pattern descriptor table >1800 bytes
- > >1800 - >1AFF Screen image table >300 bytes
- > >1B00 - >1B7F Sprite attribute list >80 bytes
- > >1B80 - >1FFF free space >480 bytes
- > >2000 - >37FF Color table >1800 bytes
- > >3800 - >3BFF Sprite descriptor table >400 bytes
- > >3C00 - >3FFF free space >400 bytes
-
- Sean, the E/A manual is wrong, but the 1 page addendum explains many errors
- in it. Included is the correction for bit-map mode register settings.
-
- Pattern descriptor table: at >0000-17FF, r4 = >03
- at >2000-37FF, r4 = >07
-
- Color table: at >0000-17FF, r3 = >7F
- at >2000-37FF, r3 = >FF
-
- "Now why did TI do this?" you may ask. The simple explanation is that the bits
- in the registers correspond to video RAM address bits. Bit 2 (bit 5 in TI's
- big-endian numbering scheme) of r4 corresponds to the most significant bit of
- the video RAM address. Bit 7 (or TI's bit 0) of r3 corresponds to the most
- significant bit of the video RAM address as well.
-
- The value of the pattern descriptor table base address is the value in r4
- of the meaningful bits shifted by 11 (or multiplied by 2048). The color table
- base address is the value in r3 of the meaningful bits shifted by 6 (or
- multiplied by 64).
-
- For bitmap mode, the meaningful bit of r4 gives a value of 0 or 4. Multiply
- by 2048 and you get 0 or 8192 (>0000 or >2000), respectively. The meaningful
- bit of r3 gives a value of 0 or 128. Multiply by 64 and you get 0 or 8192
- (>0000 or >2000), respectively.
-
- Designing the TMS9918A (and V9938/V9958) this way simplifies the routing of the
- register values to address lines on the die. The other option would require
- routing different bits of r3 and r4 as the most significant bit of the video
- RAM address.
-
- The "unused" bits of r3 and r4 less significant than the used bits should be
- set to 1. This is so that the address lines these less significant bits
- correspond to do not have their values masked to 0.
-
- When you put >00 into r4, you were making A13, A12, and A11 of the pattern
- descriptor address always 0. This meant when the VDP was fetching >0000-07FF,
- it fetched the first 2048 bytes. Also, when the VDP was fetching >0800-0FFF,
- it was fetching >0000-07FF. Likewise with >1000-17FF.
-
- For the 9918A, the video address bits correspond to register bits as follows:
-
- r3 = A13 A12 A11 A10 A9 A8 A7 A6
- r4 = 0 0 0 0 0 A13 A12 A11
-
- Now you can do some weird things if you know that when you set one of the
- "unmeaningful" bits of r3 or r4 during bitmap mode to 0 you are in fact ANDing
- the corresponding address lines when said registers are used for a display
- fetch with 0, or effectively masking them to 0. So, you can cut the color
- table to 2048 bytes by setting A12 and A11 of r3 to 0, or putting the values
- >1F or >9F into it depending on where you want the base address to be.
-
- Using this undocumented functionality is what our good friend Eric Lafortune
- did in "Rock Runner" to get great graphic effects. I have also used this
- functionality to write a 64-column terminal emulator. With a full 6K pattern
- descriptor table, and 2K color table, there is 8K of video RAM left. This is
- enough to hold 8 screen image tables which can be quickly flipped for a scroll
- effect, with only the patterns for lines 7, 15, and 23 (new line) needing to
- be re-drawn in the pattern descriptor table.
-
- Of course, I could cut the color table down to 1K by masking an additional
- address bit (A10) to 0. In fact, I can cut it down to 64 bytes by making all
- of A12 to A6 bits in r3 to 0. Load all 64 bytes with the same two color code,
- such as >1F, and the entire screen will be black and white. However, just
- defining those 64 bytes is actually just defining the colors for 8 pixel lines
- of each 8 characters.
-
- Isn't this all very interesting? You can have a complete monochrome bitmap
- display with 6K for patterns, 64 bytes for colors, and 768 bytes for pattern
- position (screen image table). With the fast scroll, I was using in my 64x24
- column terminal emulator eight separate screen image tables which must be put
- on 1K boundaries non-conflicting with pattern descriptor table or color table.
-
- The pattern descriptor table is put at >0000-17FF by loading r4 with >03. The
- color table is put at >2000-203F by loading r3 with >80. Two screen image
- tables are located at >1800-1AFF (r2=>06) and >1C00-1EFF (r2=>07). Six more
- can be located at >2400-26FF (r2=>09), >2800-2AFF (r2=>0A), >2C00-2EFF (r2=>0B),
- >3000-32FF (r2=>0C), >3400-36FF (r2=>0D), and >3800-3AFF (r2=>0E).
-
- To do the scroll takes some fairly complex programming, but setting up the
- eight screen image tables is a big and easy part of it. The first screen
- image table has >00-FF repeated three times. The second screen image table
- has >20-FF,>00-1F repeated three times. The third screen image table has
- >40-FF,>00-3F repeated three times. See the pattern? The eighth and last
- screen image table has >E0-FF,>00-DF repeated three times.
-
- The tricky part, and the part that slows the code down, is re-drawing the 8th,
- 16th, and 24th lines after a screen image table page flip. This is because
- the first line in the middle third of the screen must be scrolled to the
- last line of the top third of the screen. The first line of the last third
- of the screen must be scrolled to the last line middle third of the screen.
- The last line of the last third of the screen must be drawn over with the
- new line.
-
- Of course, I have written complex code to handle all this special scrolling.
- The 64 columns looks quite good with the right font. There is sufficient
- memory left of the 16K video RAM for disk I/O buffers and limited sprites. A
- TE can do without sprites (none in text mode TE's). There would be 256 bytes
- after each of the first seven alternate screen image tables. After the color
- table would be 960 contiguous bytes. After the eighth alternate screen image
- table would be 1280 contiguous bytes. A CALL FILES(2) equivalent would have
- room in that 1280 bytes to handle disk I/O.
-
- Jeff White
-
- p.s.: I typed this online in the VAX/VMS line editor, so any mistakes are not
- my fault. :^)
-
- -*-
- =============================================================================
- DTIHM029
-
- From: daven@vx.cis.umn.edu (David Nieters)
- Subject:v9938 Graphics 4 mode tutorial Part 1
- Date: Fri, 2 Apr 1993 21:23:00 GMT
- Message-ID:<2APR199316233934@vx.cis.umn.edu>
-
- This is a tutorial for those of you with Geneves or 99/4A's with an
- 80 column (i.e. 9938) device attached to it. It is written for those
- who want to begin to learn how to use the more advanced featues of the
- V9938 that the 9918A does not offer.
-
- This is a tutorial on using the V9938 in Graphics 4 mode. In part 1, I
- will be explaining a program called LINES that was written for the 9918A
- processor to demonstrate it's graphic mode. This program came from TI with
- the Mini-Memory module. I will extend this program to use Graphics 4 mode.
- In later tutorials, we will try to increase the performance of this program
- using the V9938's build in commands.
-
- If there is sufficient interest, I will write parts two and three and post
- them as well.
-
- OVERVIEW OF GRAPHICS 4 MODE
- ---------------------------
-
- In Graphics 4 mode, there is no Pattern Generator Table like we have been
- used to in the 9918A. Instead, each pixel on the screen is controlled by a
- 4-bit color assignment in the Pattern Name Table. Therefore, each pixel
- can be one of 16 colors and each byte in the Pattern Name Table describes
- two pixels on the screen. The screen size is either 256 X 192 or 256 X 212
- pixels depending on the LN bit of VDP register 9. Therefore, the Pattern
- Name Table will be 24,576 or 27,136 bytes respectively. The Pattern Name
- Table can be located in only four areas of memory. They are 0, >08000,
- >10000, >18000. The location is determined by Register #2. For this
- program, the Pattern Name Table will start at 0.
-
- OVERVIEW OF THE LINES PROGRAM
- -----------------------------
-
- The lines program is in basically three parts. One part determines where
- the end points of each line will be. It then calls another part which
- draws a line between the end points. That part then calls another routine
- to plot each individual point.
-
- One pitfall that I encountered early on is addressing the VDP memory. The
- 9918A had a maximum of 16KB and therefore used only 14 bits to address all
- of it's memory. The 9918A has 128KB of memory, thus needing 17 bits to
- address all of its memory. When using the standard VDP memory routines
- (e.g. VSBW,VSBR,VMBW,VMBR), you can only access 16KB of memory. As we saw
- earlier, Graphics 4 mode uses over 24KB of memory. Before using the routines
- VSBW,VSBR,VMBW, and VMBR, you must make sure the three high order bits of the
- address are set in VDP register 14 first.
-
- Another problem I had was when writing repeatedly to VDPWD. Each time you
- write a byte of data, the VDP address gets incremented automatically. If
- you continually write past a 16KB boundry, R14 will get incremented so that
- the next time you make a call ro VSBW,VSBR,VMBW, or VMBR, it is acting on a
- different location in memory. Therefore, it is important to always write to
- VDP Register 14 before reading and writing VDP memory.
-
- Finally, it is important to set VDP Register 14 back to zero before exiting.
- If not, when the system is reset, it will begin to write in high areas of VDP
- memory and your title screen will not appear right without another reset.
-
- Now, on with the source code. If there are parts that are not clear, make
- a comment to me and I will try to clear it up in my next tutorial.
-
- REF VWTR,VSBW,VMBW,KSCAN,VSBR
- REF VDPWD,VDPWA,VDPSTA
-
- HEIGHT EQU 212 NUMBER OF LINES
- NUMLIN EQU 100 NUMBER OF LINES WE DRAW BEFORE ERASING SCREEN
-
-
- * CLEAR THE SCREEN
- *
- * THIS ROUTINE CLEARS THE SCREEN BY WRITING ZEROS IN THE
- * PATTERN NAME TABLE. WHEN DEALING WITH THE LARGER MEMORY
- * SPACE OF THE V9938, WE HAVE TO BE SURE THAT REGISTER #14
- * IS CLEARED BEFORE WE START. OTHERWISE WE MIGHT BY ZEROING
- * OUT HIGHER AREAS OF MEMORY THAN WE WANT TO.
- *
- CLEAR LI R0,>0E00 RESET OUR VDP ADDRESS
- BLWP @VWTR
- LI R0,>0040
- MOVB R0,@VDPWA
- SWPB R0
- MOVB R0,@VDPWA
- LI R2,HEIGHT*128 WE WILL WRITE 24,576 ZEROS
- CLR R0
- CLEAR1 MOVB R0,@VDPWD
- DEC R2
- JNE CLEAR1
- RT
-
- * RANDOM NUMBER GENERATOR
- *
- * THIS PROCEDURE RETURNS A (NOT SO) RANDOM NUMBER IN R1.
- * IT ENSURES THE RANDOM NUMBER WILL NOT BE 0.
- *
- RAND MOV @SEED,R1
- RAND1 AI R1,>1D6B
- JEQ RAND1
- MOV R1,@SEED
- RT
-
- SEED DATA >690A
-
- DX1 DATA 0 THESE LOCATIONS ARE USED TO STORE
- DX2 DATA 0 HOW FAR THE ENDPOINTS MOVE EACH
- DY1 DATA 0 TIME A LINE IS DRAWN
- DY2 DATA 0
-
- * COLOR FLAG
- *
- * WHEN COLOR FLAG IS ZERO, THE LINES WILL APPEAR IN
- * DIFFERENT COLORS. WHEN IT IS NOT SET TO ZERO, ALL
- * LINES WILL BR DRAWN IN THE SAME COLOR. IT'S TOGGLED
- * BY PRESSING THE 'C' WHILE LINES ARE BEING DRAWN.
- *
- CFLAG DATA 0
-
- * POINT
- *
- * POINT WILL TAKE AN X COORDINATE IN R0 AND A Y
- * COORDINATE IN R1 AND A COLOR IN R2 AND PLOT THAT
- * POINT ON THE SCREEN
- *
- POINT SLA R1,8 COMPUTE OFFSET IN PATTERN NAME TABLE
- A R1,R0
- SRL R0,1
- JOC POINT1 SEE IF LEFT HAND OR RIGHT HAND
- LI R3,>F000
- MOV R2,R4
- SLA R4,12
- JMP POINT2
- POINT1 LI R3,>0F00
- MOV R2,R4
- SLA R4,8
- POINT2 MOV R0,R2
- ANDI R0,>C000 WRITE UPPER 2 BITS OF ADDRESS
- SRL R0,14 TO VDP REGISTER 14
- ORI R0,>0E00
- BLWP @VWTR
- MOV R2,R0
- ANDI R0,>3FFF
- BLWP @VSBR READ BYTE ALREADY THERE
- SZCB R3,R1 CLEAR OUT OLD COLOR
- SOCB R4,R1 PUT IN NEW COLOR
- BLWP @VSBW REWRITE OUT TO THE SCREEN
- RT
-
- * PLOT
- *
- * THIS ROUTINE PLOTS A LINE FROM (X1,Y1) TO (X2,Y2)
- * THESE COORDINATES ARE LOCATED IN THE CALLERS
- * REGISTERS R6,R7,R8 AND R9. THE COLOR IS
- * SPECIFIED IN THE CALLER'S R10.
- *
- PLOT DATA >8300
- DATA PLOT1
-
- PLOT1 CLR R12
- LI R5,1
- LI R6,1
- MOV @16(R13),R7
- MOV @12(R13),R9
- S R9,R7
- JLT PLOT11
- JMP PLOT2
- PLOT11 NEG R7
- NEG R5
- PLOT2 MOV R7,R7
- JNE PLOT3
- SETO R12
- PLOT3 MOV @18(R13),R8
- MOV @14(R13),R10
- S R10,R8
- JLT PLOT4
- JMP PLOT5
- PLOT4 NEG R6
- NEG R8
- PLOT5 MOV R9,R0
- MOV R10,R1
- MOV @10(R13),R2 GET COLOR
- BL @POINT
- C R9,@16(R13)
- JNE PLOT6
- C R10,@18(R13)
- JNE PLOT6
- RTWP
-
- PLOT6 MOV R12,R12
- JLT PLOT7
- A R5,R9
- S R8,R12
- JMP PLOT5
- PLOT7 A R6,R10
- A R7,R12
- JMP PLOT5
-
- * MAIN PROGRAM
- *
- START LWPI >8320
- LI R2,VDPREG SET VDP REGISTERS
- L1 MOV *R2+,R0
- JLT L2
- BLWP @VWTR
- JMP L1
- BL @CLEAR CLEAR THE SCREEN
-
- CLR @CFLAG
- CLR R3 R3 COUNTS THE NUMBER OF LINES WE HAVE DRAWN
-
- LI R6,>80 SET THE ENDPOINTS FOR OUR FIRST LINE
- LI R7,>60
- LI R8,>D3
- LI R9,>13
-
- CLR R0 SET THE INITIAL AMOUNTS THE ENDPOINTS
- INCT R0 MOVE BY
- MOV R0,@DX1
- INCT R0
- MOV R0,@DY1
- INCT R0
- MOV R0,@DX2
- INCT R0
- MOV R0,@DY2
- LOOP MOV @CFLAG,R0
- JNE L5
- BL @RAND PICK A RANDOM COLOR
- ANDI R1,>F
- MOV R1,R5
- CI R5,2 MAKE SURE WE DON'T HAVE BLACK
- JHE L5
- ORI R5,2
- L5 A @DX1,R6 MOVE THE ENDPOINTS
- A @DY1,R7
- A @DX2,R8
- A @DY2,R9
-
- * CHECK TO MAKE SURE THAT NO ENDPOINTS HAVE MOVED OFF
- * THE SCREEN. IF SO, REVERSE ITS DIRECTION.
- *
- MOV R6,R6
- JLT L6
- CI R6,>100
- JLT L7
- L6 NEG @DX1
- A @DX1,R6
-
- L7 MOV R8,R8
- JLT L8
- CI R8,>100
- JLT L9
- L8 NEG @DX2
- A @DX2,R8
-
- L9 MOV R7,R7
- JLT L10
- CI R7,HEIGHT
- JLT L11
- L10 NEG @DY1
- A @DY1,R7
- L11 MOV R9,R9
- JLT L12
- CI R9,HEIGHT
- JLT L13
- L12 NEG @DY2
- A @DY2,R9
-
- L13 BLWP @PLOT
-
- L14 CLR R0 CHECK TO SEE IF A KEY IS PRESSED
- MOVB R0,@>8374
- BLWP @KSCAN
- MOVB @>8375,R0
- MOVB @>837C,R1
- JEQ L16
- CI R0,>0500 CHECK FOR QUIT KEY
- JNE L15
- B @QUIT
- L15 CI R0,>4300 CHECK FOR "C" KEY PRESSED
- JNE L14
- INV @CFLAG TOGGLE THE COLOR FLAG
- L16 CI R0,>FF00
- JNE L14
- INC R3
- CI R3,NUMLIN SEE IF WE HAVE MORE LINES TO DRAW
- JNE LOOP IF SO, GO BACK AND DRAW THEM
-
- CLR R3
- LI R2,10
- LI R4,>FFFF
- DLY DEC R4 WAIT A LITTLE BEFORE CLEARING THE SCREEN
- JNE DLY
- DEC R2
- JNE DLY
-
- BL @RAND COMPUTE NEW RANDOM MOVEMENTS
- MOV R1,R1
- JLT L17
- ANDI R1,7
- JMP L18
- L17 ORI R1,>FFF8
- L18 MOV R1,@DX2
- BL @RAND
- MOV R1,R1
- JLT L19
- ANDI R1,7
- JMP L20
- L19 ORI R1,>FFF8
- L20 MOV R1,@DY1
- BL @RAND
- MOV R1,R1
- JLT L21
- ANDI R1,7
- JMP L22
- L21 ORI R1,>FFF8
- L22 MOV R1,@DX1
- BL @RAND
- MOV R1,R1
- JLT L23
- ANDI R1,7
- JMP L24
- L23 ORI R1,>FFF8
- L24 MOV R1,@DY2
-
- BL @CLEAR CLEAR SCREEN
- B @LOOP START OVER
-
- QUIT LI R2,REG2 RESTORE VDP REGISTERS BACK TO NORMAL
- QUIT1 MOV *R2+,R0
- JLT QUIT2
- BLWP @VWTR
- JMP QUIT1
- QUIT2
- LIMI 2
- BLWP @0
-
- * VDP REGISTERS TO SET VDP TO GRAPHICS 4 MODE
- *
- VDPREG DATA >0006
- DATA >0160
- DATA >021F LOCATE NAME TABLE AT ADDRESS 0
- DATA >0711 SET BACKGROUND TO BLACK
- DATA >080A INHIBIT SPRITES
- DATA >0980 212 LINES
- DATA >FFFF
-
- * VDP REGISTERS WHEN WE EXIT
- *
- REG2 DATA >0000
- DATA >0F00
- DATA >01F0
- DATA >0200
- DATA >03FF
- DATA >0401
- DATA >0560
- DATA >0E00
- DATA >FFFF
-
- END START
-
- =============================================================================
- DTIHM030
-
- In search of.... Leading Edge Connectors.
- by Dan H. Eicher
-
- A while back I was sourcing parts to finish a 99/8 P-Box interface card.
- For those of you who have looked at your cards, you may have noticed at
- one point or another certain cards having a black plastic edge connector.
-
- These are sort of rare. These connectors are called TI Leading Edge
- Connectors. They provide an alternative to just making and edge connector
- by printing traces on the bottom of the PCB.
-
- For a while TI was pushing these connectors on the electronics industry,
- of course these connectors never gained much popularity in the consumer
- market, because no one wanted to spend the few extra cents for quality
- goods.
-
- Note: These connectors are built to very high standards, they will survive
- many insert/extraction cycles and are designed to give maximum conductivity
- in a variety of situations. These connectors are also gold plated, as
- all good connectors should be.
-
- **** End of editorial ****
-
- Well I needed to buy one of these to finish my 99/8 interface card. Well
- after some calls to my local suppliers, Newark, Jameco ect... I came up
- empty.....
-
- Well after many MANY phone calls I got a hold of the TI division that
- makes these connectors. When I called six months ago, they were on the
- list to be obsoleted, but were still available. So if you want any of
- these connectors to repairs boards or place in your stock, you had better
- call now....
-
- TI Part # L2111121-30 and the person to call is:
- Sue Rodgers 508.236.5375
-
- Hope that this can save someone sometime!
-
- Dano
- L.D.O.M. 06.27.95
- ===========================================================================
- DTIHM031
-
- Modify the Rave Speech Card and MBP Card for use with the Geneve.
- by Beery Miller
-
-
- Item 7747642 94/05/05 23:20
- From: BW.MILLER Beery W. Miller
- To: BW.MILLER Beery W. Miller
- COMP.SYS.TI.USENET@GATEKEEPER.DEC.COM@INET#
-
- Sub: To: Markus Kraemer
-
- Markus, here are the mods to the Rave Speech card and the MBP that permits
- full decoding of those cards to work with the Geneve. Any Geneve using one
- of those cards without these mods are subject to PROBLEMS, PROBLEMS,
- PROBLEMS.
-
- The mods for the Geneve compatibility is as follows:
-
- Solder pins 8 and pins 16 of a 74LS138 to pins 8 and 16 of 74LS138 on the
- card (this is for +5 volts and ground only, you may use another source if
- available), i.e. piggyback the chips.
-
- Now for the decoding mod that properly decodes the Rave Speech card and the
- MBP card for full Geneve Compatibility (these devices will only respond at
- page >BC)
-
- Cut the trace of pin 56 on the card near the bus connector
-
- Pins of 74LS138
- _____________________________________________________________-
-
- 1 Connect to bus pin 46
- 2 Connect to bus pin 45
- 3 Connect to bus pin 48
- 4 Connect to bus side of bus pin 56
- 5 Connect to bus pin 8
- 6 Connect to bus pin 9
- 7 Connect to component side of bus pin 56
- 8 Connect to pin 8 of 74LS138
- 16 Connect to pin 16 of 74LS138
-
- (pins 9 through 15 are left disconnected)
-
- These modifications are done at your own risk. You assume all responsibilty
- for performing these modifications.
-
- ==========================================================================
- DTIHM032
-
- Here is the pin definition for the new Rave expansion box.
- For further information you can contact:
-
- RAVE 99 Co.
- Attn: John McDevitt
- 112 Rambling Road
- Vernon, CT 06066
- (203)-871-7824
-
- I have "transcribed" this information from the manual that comes with
- the Rave p-box. Any errors are my own. Hope this information helps.
-
- Dan H. Eicher
- Delphi: EICHER
-
- Looking into connector from the component side - pin 1 towards rear of
- chassis.
- ____
- Plus 12 Volts Reg. +12V 2 = = 1 +12V Plus 12 Volts Reg.
- Ready A READY A 4 = = 3 GND Logic Ground
- Computer Reset RESET 6 = = 5 GND Logic Ground
- System Clock SCLK 8 = = 7 GND Logic Ground
- Audio AUDIO 10 = = 9 LCP CPU Indicator
- PCB Enable PCBEN 12 = = 11 RBDENA Remote Data Bus Control
- IAQ Hold A IAQHA 14 = = 13 HOLD CPU Hold Request
- Inter. Level B SENILB 16 = = 15 SENILA Inter. Level A Sense Enabl
- Load Interrupt LOAD 18 = = 17 INTA Inter. Level A
- Logic Ground GND 20 = = 19 D7 System Data Bit 7
- System Data Bit 6 D6 22 = = 21 D5 System Data Bit 5
- System Data Bit 4 D4 24 = = 23 D3 System Data Bit 3
- System Data Bit 2 D2 26 = = 25 D1 System Data Bit 1
- System Data Bit 0 D0 28 = = 27 GND Logic Ground
- System Address Bit 15 A15/CRU 30 = = 29 A14 System Address Bit 14
- System Address Bit 13 A13 32 = = 31 A12 System Address Bit 12
- System Address Bit 11 A11 34 = = 33 A10 System Address Bit 10
- System Address Bit 09 A09 36 = = 35 A08 System Address Bit 08
- System Address Bit 07 A07 38 = = 37 A06 System Address Bit 06
- System Address Bit 05 A05 40 = = 39 A04 System Address Bit 04
- System Address Bit 03 A03 42 = = 41 A02 System Address Bit 02
- System Address Bit 01 A01 44 = = 43 A00 System Address Bit 00
- System Address Bit A AMA 46 = = 45 AMB System Address Bit B
- System Address Bit C AMC 48 = = 47 GND Logic Ground
- CPU Clock CLKOUT 50 = = 49 GND Logic Ground
- DATA Bus Direction DBIN 52 = = 51 CRUCLK CRU Clock
- CPU Write Enable WE 54 = = 53 GND Logic Ground
- Memory Request MEMEN 56 = = 55 CRUIN CRU Input Data
- Minus 12 Volts Reg. -12V 58 = = 57 -12V Minus 12 Volts Reg.
- Plus 12 Volts Reg. +12V 60 = = 59 +12V Plus 12 Volts Reg.
- ----
-
- ____
- Plus 5 Volts Reg. +5v 2 = = 1 +5V Plus 5 Volts Reg.
- Minus 12 Volts Reg. -12v 4 = = 3 -12V Minus 12 Volts Reg.
- Sound Out Geneve SNDOUTG 6 = = 5 GENSEL Geneve/4A Select Line
- Key Lock Switch KEYLSW 8 = = 7 VIDOUTG Video Out Geneve
- Extra Bit #10 XB10 10 = = 9 XB9 Extra Bit #9
- System Address Bit G AMG 12 = = 11 AMF System Address Bit F
- System Address Bit I AMI 14 = = 13 AMH System Address Bit H
- System Address Bit K AMK 16 = = 15 AMJ System Address Bit J
- System Address Bit M AMM 18 = = 17 AML System Address Bit L
- Logic Ground GND 20 = = 19 D15 System Data Bit 15
- System Data Bit 14 D14 22 = = 21 D13 System Data Bit 13
- System Data Bit 12 D12 24 = = 23 D11 System Data Bit 11
- System Data Bit 10 D10 26 = = 25 D9 System Data Bit 09
- System Data Bit 08 D8 28 = = 27 GND Logic Ground
- Keyboard Data Geneve KBDAT 30 = = 29 KBCLK Keyboard Clock Geneve
- Turbo Switch TURBO/SW32 = = 31 RESETSW Reset Switch
- Minus 5 Volts Reg. -5V 34 = = 33 -5V Minus 5 Volts Reg.
- Plus 12 Volts Reg. +12V 36 = = 35 +12V Plus 12 Volts Reg.
- ----
-
- The following is an editors note:
-
- For comparision the max for the different voltage lines on a "typical"
- IBM type 200 watt switching power supply is:
-
- +5V 20A
- -5V 0.5A
- +12V 8A
- -12V 0.5A
-
- The "Standard" TI power supply has the following ratings (per the
- Bunyard Manual):
-
- .5 Amps per card slot is available from the +5V
- .25 " " " " " " " " +12V
- 50 ma " " " " " " " -12V
-
- These calculations include a debit for the internal disk drive
- from the power supplies total capability.
-
- ==============================================================================
-
- DTIHM033
-
- TI-99/4 - THE EARLY DAYS
- by Chuck Neal
- Portland Users Ninety Niners
-
- Here is an interesting bit of TI history that came over the UNIX user net at
- work. I rearranged some of the material for clarity. The contributor of this
- article was Herbert H. Taylor of the David Sarnoff Research Center. It appears
- that he worked at Texas Instruments back in the late 1970's when the TI-99 "Was
- Happening."
-
- First you will find out what the "pack-man door" on your speech synthesizer is
- for (was for!). Next he talks about some mysterious "wireless peripherals" that
- the TI 99/4 almost had. Then the replacement of the 9985 microprocessor by the
- 9900 and the suggestion that there are a lot more intersting stories waiting to
- be told!
-
- The last part of the article goes into the history of the RF modulator. In the
- early days you had to hook your TI into a television set, and television sets
- don't have audio and video inputs - they have radio frequency inputs. (Except
- for some of the new ones). So the RF modulator is like a miniature TV
- broadcasting station, broadcasting on channel 3.
-
- SPEECH SYNTHESIZER
-
- The plug-in port on the speech module was intended to expand the number of
- permanent words of vocabulary as in Speak-N-Spell. When TE-II worked better
- than expected, TI lost interest in expansion modules. It is possible that only
- the first few thousand speech modules have the "hooks" for those modules. I own
- several vintage speech modules and they all have the hooks, but I never got any
- plug-in modules and I designed the interface...(Please, no questions, it's been
- 11 years!)
-
- WIRELESS PERIPHERALS
-
- Another historical note: the first few thousand orginal 99/4's had a hidden
- plug in slot on the top flat surface ( under the metal overlay) for an IR (
- Infer-Red ) remote control transmitter/receiver about the size of a Kodak
- Instamatic. This device supported a number of never introduced wireless
- peripherals - including a wireless "super" keyboard and joystick.
-
- The wireless peripherals were supported on the systems shown at the June 1979
- CES show in Chicago. Ten minutes before the introductory press conference, we
- were told "...not to show the peripherals..." In any event I am fairly certain
- the software support for these peripherals was left in GROM - at least until
- the switch to the 99/4A, which included the new (actually the "original")
- keyboard.
-
- These peripherals were never introduced because TI thought that they were too
- expensive for a Home Computer with an intended 1979 price of uner $100. (When
- Apple was $2000) When the price "skyrocketed" to $1000, it was supposedly "too
- late" to bring out the wireless peripherals.
-
- The price increase was due to the complete failure of the cheap TMS9985
- microprocessor orginally designed into the 99/4. This resulted in changing over
- to a very expensive goldlead ceramic packaged TMS9900, a TTL clock driver, a
- 256 byte static RAM, and a ton of TTL glue logic. (The true story of how the
- 9900 ended up in the 99/4 would rival General Hospital!)
-
- VIDEO MODULATOR
-
- Also the first few hundred units had the "hooks" to bring in external video and
- genlock the TMS9918 - a capability which even today is not generally found in
- personal computers. This was removed from the connector (despite its less than
- $1.00 cost in parts) because at the time of the 99/4 introduction, the
- interface had not been tested sufficiently and there was still too much
- unvertainty about the FCC implications of genlocking a class 1 TV device.
-
- Remember at the time (1979), any TV game or computer that had an RF modulator
- had to pass very strict FCC testing. The 99/4 orginally had a built-in RF
- modulator, which was removed shortly before the June 1979 CES show when the
- decision was made to package the 99/4 with the Zenith color monitor.
-
- In 1978 we built 200 prototype 99/4's with built-in RF modulators and a 9900
- "emulation" of the 9985 on a 9"x4" board sandwhiched onto the original PWB and
- crammed into the orginal 99/4 tooled case. These 200 units were given to TI
- executives and board members to play with for six months. I have a wire-wrapped
- proto type with one of the few 9985's ever produced, but I would be interested
- in acquiring any of the 200 prototypes which might be existant.
-
- Everyone was quite shocked when the FCC ruled in TI's favor. That ruling
- distinguished personal computers from video games.
-
- The decision to remove the RF modulator from the console was initiated when the
- FCC agreed to test a fiber optic interface we had developed. This optically
- coupled the computer console with a standalone RF modulator. This interface was
- dubbed the "video light pipe". After the system was sent to the FCC they
- returned in UNTESTED, stating that they could not accept petitions for rule
- making to modify existing rules. The rest is history.
-
- L.D.O.M. 11.25.94
- ==============================================================================
- DTIHM034
-
- 9900,9901,9902,9904 by Definitions
- by Dan Eicher
-
-
- ___ ___
- VBB 01 =| U |= 64 HOLD - * Note Pins with a - before or
- VCC 02 =| |= 63 MEMEN - after them represent active
- WAIT 03 =| T |= 62 READY lows.
- -LOAD 04 =| M |= 61 WE
- HOLDA 05 =| S |= 60 CRUCLK
- -RESET 06 =| |= 59 VCC
- IAQ 07 =| 9 |= 58 NC
- u1 08 =| 9 |= 57 NC
- u2 09 =| 0 |= 56 D15
- A14 10 =| 0 |= 55 D14
- A13 11 =| |= 54 D13
- A12 12 =| |= 53 D12
- A11 13 =| |= 52 D11
- A10 14 =| |= 51 D10
- A09 15 =| |= 50 D09
- A08 16 =| |= 49 D08
- A07 17 =| |= 48 D07
- A06 18 =| |= 47 D06
- A05 19 =| |= 46 D05
- A04 20 =| |= 45 D04
- A03 21 =| |= 44 D03
- A02 22 =| |= 43 D02
- A01 23 =| |= 42 D01
- A00 24 =| |= 41 D00
- u4 25 =| |= 40 VSS
- VSS 26 =| |= 39 NC
- VDD 27 =| |= 38 NC
- u3 28 =| |= 37 NC
- DBIN 29 =| |= 36 IC0
- CRUOUT 30 =| |= 35 IC1
- CRUIN 31 =| |= 34 IC2
- -INTREQ 32 =|_____|= 33 IC3
-
- ___ ___
- RST1 01 =| U |= 40 VCC
- CRUOUT 02 =| |= 39 S0
- CRUCLK 03 =| T |= 38 P0
- CRUIN 04 =| M |= 37 P1
- -CE 05 =| S |= 36 S1
- -INT6 06 =| |= 35 S2
- -INT5 07 =| 9 |= 34 -INT7/+P15
- -INT4 08 =| 9 |= 33 -INT8/+P14
- -INT3 09 =| 0 |= 32 -INT9/+P13
- -u 10 =| 1 |= 31 -INT10/+P12
- INTREQ 11 =| |= 30 -INT11/+P11
- IC3 12 =| |= 29 -INT10/+P10
- IC2 13 =| |= 28 -INT09/+P09
- IC1 14 =| |= 27 -INT08/+P08
- IC0 15 =| |= 26 P2
- VSS 16 =| |= 25 S3
- -INT1 17 =| |= 24 S4
- -INT2 18 =| |= 23 -INT15/+P7
- P6 19 =| |= 22 P3
- P5 20 =| |= 21 P4
- -------
- ___ ___
- -INT 01 =| U |= 18 VCC Note: This chip can be replaced with
- XOUT 02 =| T |= 17 -CE a 9903. The 9903 is identical
- RIN 03 =| M |= 16 -u except it also includes the
- CRUIN 04 =| S |= 15 CRUCLK ability to handle sync. commun-
- -RTS 05 =| |= 14 S0 ication.
- -CTS 06 =| 9 |= 13 S1
- -DSR 07 =| 9 |= 12 S2
- CRUOUT 08 =| 0 |= 11 S3
- VSS 09 =| 2 |= 10 S4
- -------
- ___ ___
- TANK1 01 =| U |= 20 VCC Note: This chip is also called a
- TANK2 02 =| T |= 19 XTAL2 74LS
- GND1 03 =| M |= 18 XTAL1
- FFQ 04 =| S |= 17 OSCIN
- FFD 05 =| |= 16 OSCOUT
- u4 TTL 06 =| 9 |= 15 TTL u2
- u3 TTL 07 =| 9 |= 14 TTL u3
- u3 08 =| 0 |= 13 VDD
- u4 09 =| 4 |= 12 u1
- GND 10 =| |= 11 u2
- -------
-
- =============================================================================
- DTIHM035
-
- Console Connectors
- by Thierry Norspikel
-
-
- From: Thierry Nouspikel <nouspike@cmu.unige.ch>
- Subject: Re: Article.
- In-reply-to: <01ICOTL7T8WY973IFF@delphi.com>
-
- CASSETTE TAPE FORMAT
-
- Name # of bytes Content
- ----------------------------
-
- File sync 768 >00
- Data mark 1 >FF
- Size 1 # of records
- Repeat size 1 dito
- Rec sync 8 >00 }
- Data mark 1 >FF } Rec 1
- Data 64 data bytes }
- Checksum 1 sum of the 64 data bytes }
-
- Repeat rec 1
- Rec 2
- Repeat rec 2
- etc.
-
- Bits are encoded by output level CHANGES.
- With a 3 MHz console, clock ticks toggle output every 725.3 microseconds.
- To encode a 1 invert the output in the middle of this time period.
-
- This results in frequencies of 689.37 Hz for a space (0) and 1379 Hz for a
- mark (1)
-
- which is well within the audio range, thus suitable for a tape player.
-
-
- 0 _1 _0_ 1_ Bits to encode
- !___! !_! !_! !_ Output (low/high)
- c c c c c Clock intervals
-
- NB: Upon writing, the timing is ensured by loading >0011 into the clock
- register of the TMS9901 chip. The resulting delay is 17 / (3MHz/64)=363.6 usec
-
- Upon reading, the stretches of zeros are used to time the tape
- recorder and this value is fed into the TMS9901 for further reading.
-
- -------------------------------------------------------------------------------
-
- WHAT'S THE PINOUT OF THE ..... CONNECTOR ?
-
- Replace the ..... with: Joystick port, Cassette port, Main power port,
- Monitor port, Cartridge port, Peripheral port, Keyboard connector (internal)
- or Card slots (in PE box).
-
- These informations have been extracted from:
- TI-99/4A Console
- and
- Peripheral Expansion System
- Technical Data
-
- a very usefull handbook published by TI in 1983, with many informations,
- timing diagrams, console schematics, etc.
-
- ___________
- Joystick port: ( 1 2 3 4 5 )
- ============= \ 6 7 8 9 /
- # I/O Use \_______/
- -----------
- 1 not used
- 2 > Test joystick 2
- 3 < Up
- 4 < Fire button pressed
- 5 < Left
- 6 not used
- 7 > Test joystick 1
- 8 < Down
- 9 < Right
-
-
- ___________
- cassette port: ( 1 2 3 4 5 )
- ============== \ 6 7 8 9 /
- # I/O Use \_______/
- -----------
- 1 > Cass 1 motor control (CRU bit 22)
- 2 > Dito (neg)
- 3 > Output to tape 2 (CRU bit 25)
- 4 > Audio gate (CRU bit 24)
- 5 > Output to tape 2 (neg)
- 6 > Cass 2 motor control (CRU bit 23)
- 7 > Dito (neg)
- 8 < Input from tape 1 or 2 (CRU bit 27)
- 9 < Dito (neg)
-
- N.B. Cassette 1 can't be written to.
-
- Power port:
- =========== _________
- Inside console (regulated) : < 1 2 3 4 |
- ---------
- # Volts
- --------
- 1 -5
- 2 +12
- 3 GND
- 4 +5
-
- The pinouts for the external plug look like this:
- >___ ___> >--1 (red)
- )!(
- 2 )!(
- 2 )!(
- 0 )!(---> >--2 (white)
- V )!(
- ~ )!(
- >___)!(___> >--4 (black)
-
- transformer >--3 (nc)
-
- NB: for US users replace 220V with 110V
- The AC values on pins 1, 2 and 4 appear to vary according to the
- model of transformer. Thus I did not idicate them here.
-
- Monitor port: 3 U 1 (This is a round plug, with a notch U at top)
- ============= 5 4
- # Use 2
- ------
- 1 12V vid
- 2 R-Y (color burst clock)
- 3 Sound output
- 4 Y
- 5 B-Y (external video input?)
- U GND
-
- Cartridge port:
- ===============
- ______________________________________________________________
- | 2 36 |
- | [====================] |
- |_______________________________________1__________________35__|
- |___|___|___|___|___|___|___|___|___|_| |
- |_____|___|___|___|___|___|___|___|___| |
- |___|___|___|___|___|___|___|___|_____| |
- |_____|___|___|___|___|___|___|___|___| |
- |___|___|__________________|___|______|________________________|
-
- # Name I/O Use
- - ---- --- -----------
- 1 RESET < Resets the system (active high)
- 2 GND Signal groud
- 3 D7 <> Data bus, bit 7 (least significant)
- 4 CRUCLK* > Inversion of TMS9900 CRUCLOCK pin
- 5 D6 <>
- 6 CRUIN < CRU input to TMS9900
- 7 D5 <>
- 8 A15 > Address bus, bit 15 / also CRU output bit
- 9 D4 <>
- 10 A13 >
- 11 D3 <>
- 12 A12 >
- 13 D2 <>
- 14 A11 >
- 15 D1 <>
- 16 A10 >
- 17 D0 <> Data bus, bit 0 (most significant)
- 18 A9 >
- 19 VCC +5 Volts power supply
- 20 A8 >
- 21 GS* > Grom select. Active low is addr in >9800-9FFF
- 22 A7 >
- 23 A14 > Address bus, bit 14. Select mode: low=data / high=addr
- 24 A3 >
- 25 DBIN > Active high = read memory
- 26 A6 >
- 27 GRC > GROM clock: color burst of VDP 9918A
- 28 A5 >
- 29 VDD -5 Volts power supply
- 30 A4 >
- 31 GR < Active high = GROM ready
- 32 WE* > Active low = write enable (derived from TMS9900 WE*)
- 33 VSS
- 34 ROMG* > Active low if addr in >6000-7FFF
- 35 GND
- 36 GND
-
- Side port: (peripheral connector)
- ==========
- __________________________
- / |
- / |
- ____________________________/ 2 44 |
- / [================] |
- / 1 43 |
- |__________________________________________________________|
-
- # Name I/O Use
- - ---- --- -----------
- 1 VCC +5 Volts power supply
- 2 SBE > Low if addr in >9000-94xx (sound port)
- 3 RESET* > System reset (active low)
- 4 EXTINT* < External interrupt (active low)
- 5 A5 > Address bus, bit 5
- 6 A10 >
- 7 A4 >
- 8 A11 >
- 9 DBIN > Active high = read memory
- 10 A3 >
- 11 A12 >
- 12 READY < Active high = memory is ready
- 13 LOAD* < Unmaskable interrupt (=> BLWP @>FFFC)
- 14 A8 >
- 15 A13 >
- 16 A14 >
- 17 A7 >
- 18 A9 >
- 19 A15 > Address bus, lsb. Also CRU output bit.
- 20 A2 >
- 21 GND
- 22 CRUCLK* > Inversion of TMS9900 CRUCLOCK pin
- 23 GND
- 24 PHI3* > Inversion of phase 3 clock
- 25 GND
- 26 WE* > Write Enable (derived from TMS9900 WE* pin)
- 27 GND
- 28 MBE* > Active low if addr in >4000-5FFF (card ROMs)
- 29 A6 >
- 30 A1 >
- 31 A0 > Address bus, bit 0 (most significant)
- 32 MEMEN* > Memory access enable (active low)
- 33 CRUIN < CRU input bit to TMS9900
- 34 D7 <> Data bus, bit 7 (least significant)
- 35 D4 <>
- 36 D6 <>
- 37 D0 <> Data bus, bit 0 (most significant)
- 38 D5 <>
- 39 D2 <>
- 40 D1 <>
- 41 IAQ > Interrupt acknowledged by TMS9900
- 42 D3 <>
- 43 VDD -5 Volts power supply
- 44 AUDIOIN < To sound generator AUDIO IN pin
-
- Keyboard connector: (inside the console) Red wire is #15
- ===================
- pin| 12 13 14 15 9 8 6
- ---+-------------------------------------------------------------
- 5 | = . , M N /
- 4 | space L K J H ;
- 1 | enter O I U Y P
- 2 | 9 8 7 6 0
- 7 | fctn 2 3 4 5 1 lock
- 3 | shift S D F G A
- 10 | ctrl W E R T Q
- 11 | X C V B Z
-
- Note: pressing a key closes the contact between corresponding row + column.
-
- Since there are no diodes to prevent current going backwards, pressing 3
- keys at a time often results in appearance of a "phantom" key at the 4th
- corner of the square formed by these keys (e.g 8+7+3=phantom 4: current
- goes pin15-7-8-3-pin7 as if 4 were pressed)
-
- Card slots: (inside the PE box)
- ===========
- 59 Left 1
- Front ===================== Rear
- 60 Right 2
-
- # Name I/O Use
- - ---- --- -----------
- 1 +5V 3-T regulator voltage supply (about +8V)
- 2 Dito
- 3 GND
- 4 READYA System ready (10K pull-up to +5V)
- 5 GND
- 6 RESET* > System reset (active low)
- 7 GND
- 8 SCLK nc System clock (not connected)
- 9 LCP* nc CPU indicator 1=TI99 0=2nd generation (not connected)
- 10 AUDIO < Input audio (=AUDIOIN)
- 11 RDBENA* < Active low: enable flex cable data bus drivers (1K pull-up)
- 12 PCBEN H PCB enable for burn-in (always High)
- 13 HOLD* H Active low CPU hold request (always High)
- 14 IAQHA nc IAQ [or] HOLDA (logical or)
- 15 SENILA* H Interrupt level A sense enable (always High)
- 16 SENILB* H Interrupt level B sense enable (always High)
- 17 INTA* < Active low interrupt level A (=EXTINT*)
- 18 LOAD* nc Unmaskable interrupt (not connected)
- 19 D7 <> Data bus, bit 7 (least significant)
- 20 GND
- 21 D5 <>
- 22 D6 <>
- 23 D3 <>
- 24 D4 <>
- 25 D1 <>
- 26 D2 <>
- 27 GND
- 28 D0 <> Data bus, bit 0 (most significant)
- 29 A14 >
- 30 A15 > Address bus, lsb. Also CRU output bit.
- 31 A12 >
- 32 A13 >
- 33 A10 >
- 34 A11 >
- 35 A8 >
- 36 A9 >
- 37 A6 >
- 38 A7 >
- 39 A4 >
- 40 A5 >
- 41 A2 >
- 42 A3 >
- 43 A0 > Address but, bit 0 (most significant)
- 44 A1 >
- 45 AMB H Extra address bit. Always High.
- 46 AMA H Extra address bit. Always High.
- 47 GND
- 48 AMC H Extra address bit. Always High.
- 49 GND
- 50 CLKOUT* > Inversion of phase 3 clock (=PHI3*)
- 51 CRUCLK* > Inversion of TMS9900 CRUCLOCK pin
- 52 DBIN > Active high = read memory
- 53 GND
- 54 WE* > Write Enable (derived from TMS9900 WE* pin)
- 55 CRUIN < CRU input bit to TMS9900
- 56 MEMEN* > Memory access enable (active low)
- 57 -12 Volts 3-T regulator supply voltage (about -16V)
- 58 Dito
- 59 +12 Volts 3-T regulator supply voltage (about +16V)
- 60 Dito
-
- Notes:
- o Signals buffered by 74LS244 in connection card: A0-A15, DBIN, MEMEN*, WE*,
- CLRCLK*, RESET*, CLKOUT.
- o Unbuffered signals: CRUIN, INTA*, AUDIOIN, READY
- o Data bus is buffered by two 74LS245 (one at each end of the cable),
- driven by RDBENA (direction set by DBIN).
- o All signals must be re-buffered on each card.
- o Always High lines (AMA, AMB, AMC, SENILA*, SENILB*, PCBEN, HOLD*) are pulled
- up to +5 Volts by 47 Ohms resistors.
- o Connection card light is turned on by DBIN (High = on).
-
- Thierry Nouspikel, MD, PhD | "Un technocrate c'est un mec,
- Department of Biological Sciences | tu lui poses une question,
- Stanford University | quand il a fini de repondre
- Phone: 1 415 723 2425 | tu comprends plus ta question".
- Fax: 1 415 725 1848 | Michel Colucci, dit "Coluche"
- Email: thierry.nouspikel@stanford.edu |
-
- ============================================================================
- DTIHM036
-
- How to adapt Atari joystick to work on the TI.
- Author Unknown
-
-
- TI Joystick pins Atari Joystick Pins
- -- -------- ---- ----- -------- ----
- 1) N.C. ------------1) Up S
- 2) Stick B--| | ----------2) Down t
- Ground | | | --------3) Left i
- 3) Up-----------+ | | --4) Right c
- 4) Fire---------|-|-|-| | 5) N.C. k
- Button | | | | +-----6) Fire btn
- 5) Left---------|-|-+ | | 7) N.C. B
- 6) N.C. |---|-|-|-|---|-8) Ground
- 7) Stick A--------------- | 9) N.C.
- Ground | | | | | |
- 8) Down-------- --|-|-|-|-|-1) Up S
- More?
- 9) Right---| |---+-|-|-|-|-2) Down t
- ---------+-------3) Left i
- [Female] | | --4) Right c
- | | 5) N.C. k
- --|---6) Fire btn
- | 7) N.C. A
- ----8) Ground
- 9) N.C.
-
- ============================================================================
- DTIHM037
-
- GRAND RAM
- Technical Specifications
- Last Update: August 14, 1987
-
- GRAND RAM TECHNICAL DATA INTRODUCTION
- SECTION 1
-
- The GRAND RAM card is designed to provide as many features as possible, while
- still keeping the cost reasonable. GRAND RAM provides the following features:
-
- 1. 512K bytes of battery-backed CMOS memory for RAM Disk, print spooling,
- text editing. The memory is expandable in increments of 32K bytes, using
- 256K bit static RAM chips (32K X 8 ). All memories are socketed, so no
- soldering is required for the full 512K capability.
-
- 2. Optional real-time clock allows time-stamping of files, clock access from
- BASIC, X-BASIC, assembly.
-
- 3. Two expansion ports, each with different capabilities:
- a. The Cartridge Emulator Port (CEP) provides all the signals required
- to support an add-on board which will emulate 99% of the cartridges in
- existence. The add-on board plugs into the 46 pin, dual-row, .025"
- square post header mounted on the GRAND RAM card.
-
- b. The Device Expansion Port (DEP) provides all the signals required to
- implement a variety of novel peripherals for the 99/4A, including:
- multiple channel music boards, A/D D/A capability with digital echo
- and reverberation, temperature logging, home control, etc. The device
- port add-on boards will plug into a 38 pin, dual-row, .025" square
- post header on the GRAND RAM card.
-
-
- 4. The technical specifications for these expansion ports are provided.
- GRAND RAM provides a great opportunity for hobbyists to do their own
- hardware projects. Most of the bus interface and decode circuitry is
- already provided by GRAND RAM, which makes device interfacing very
- simple.
-
- 5. A Programmable Interrupt Timer, which provides the capability for print
- spooling, hot keys (with the proper software), as well as providing
- programmable timing pulses to the Device Expansion Port.
-
- 6. Hardware Write Protect feature reduces the chances of a runaway program
- trashing the DSR.
-
- Designed by Sofmachine Inc. 1-1 Copyright 1987 DataBioTics
-
-
-
-
- GRAND RAM TECHNICAL DATA GRAND RAM Architecture
- SECTION 2
-
- All memories and devices are accessed through the DSR address space of the
- 99/4A, which is the 8K block from >4000 to >5FFF, and the CRU space. The CRU
- base address is dependent upon some DIP switch settings. Some of the CRU bits
- are used to control access to the memory and memory-mapped I/O devices. The
- 512K RAM memory is accessed in 2K pages.
-
-
- 1. CRU Base Address for GRAND RAM - Setting the DIP Switches Switches 1, 2,
- and 3 of the 4-section DIP switch are used to determine the CRU address
- at which GRAND RAM responds. Any one of seven CRU addresses may be
- selected.
-
- Since the disk controller card uses the CRU slot at >1100 and the RS232
- card uses the slot at >1300, these addresses are not available for GRAND
- RAM. The following table details the CRU addresses for all switch
- settings.
-
-
- DIP Switch/CRU Address Chart
- ---------------------------------------------
- | SW1 SW2 SW3 | CRU Address |
- ---------------------------------------------
- | ON ON ON | >1000 |
- | ON ON OFF | >1200 |
- | ON OFF ON | >1400 |
- | ON OFF OFF | >1500 |
- | OFF ON ON | >1600 |
- | OFF ON OFF | >1700 |
- | OFF OFF ON | >1800 |
- | OFF OFF OFF | GRAND RAM DISABLED |
- ---------------------------------------------
-
- 2. CRU Bits for Memory Control
- In order to access the DSR memory address space, the first CRU bit
- (CRUBIT0) in the GRAND RAM's CRU space must be set to a 1. The second
- CRU bit (CRUBIT1) is the Write Protect bit (1=Write Protected), which
- dissallows all writes to the memory space of GRAND RAM. The memory-
- mapped I/O devices are accessed at locations >4F00 - >4FFF. In order
- to access these mem-mapped I/O devices, the third CRU bit (CRUBIT2)
- must set to zero. If CRUBIT2 = 1, then memory is present at >4F00 -
- >4FFF.
-
- Designed by Sofmachine Inc. 2-1 Copyright 1987 DataBioTics
-
-
-
- GRAND RAM TECHNICAL DATA GRAND RAM Architecture
-
- 3. RAM Memory Access Mapping
- The first two 2K blocks of GRAND RAM memory (4K total) are permanently
- mapped into the first 4K bytes of the DSR space (>4000 - >4FFF).
- However, the 256-byte RAM block from >4F00 to >4FFF and the I/O devices
- are swapped in and out using CRUBIT2 as described above. The second 4K
- bytes of DSR memory space (>5000 - >5FFF) are used to access selected
- blocks of GRAND RAM memory. This second 4K space is split in half: the
- first memory space starts at >5000 and the second at >5800. The
- specific blocks of GRAND RAM memory which are mapped into these two
- address spaces are defined by two 8-bit, write-only, page registers.
- This "dual-window" architecture allows two different blocks of GRAND
- RAM memory to be accessed without banking.
-
- 4. Onboard I/O Device Mapping
- There are only four active I/O device locations on the GRAND RAM board.
- Two are the write-only memory page registers (discussed above) and the
- remaining two are the read and write locations for the real-time clock.
- The address and function of each device location is described below, as
- well as the required value of CRUBIT0 thru CRUBIT2 when accessing these
- devices.
-
-
- CRU I/O Map
-
- Address CRUBIT0 CRUBIT1 CRUBIT2 Function
- -----------------------------------------------------------------------
- >4FE0 1 0 0 Selects which 2K page of GRAND
- RAM memory is mapped into the
- address space from >5000 to
- >57FF.
- >4FE2 1 0 0 Selects which 2K page of GRAND
- RAM memory is mapped into the
- address space from >5800 to
- >5fFF.
- >4FE4 1 0 0 Write to the Real-time Clock
- >4FE6 1 0 X Read from the Real-time Clock
-
- 5. TMS9901 Interval Timer I/O Peripheral
- The TMS9901 is a peripheral designed specifically for the 9900 family of
- microprocessors, and contains: 16 general-purpose I/O lines, 6 interrupt
- lines (also usable simply as input lines), a timer with 21.3 uS
- resolution and interrupt capability. The 9901 occupies 32 bits of CRU
- space, starting at the CRU base selected by the GRAND RAM DIP switches.
- IMPORTANT NOTE TO ALL PROGRAMMERS AND DEVELOPERS: the CRU bit addresses
- have been modified slightly such that the top and bottom halves of the
- 9901 CRU bit mappings have been swapped. This means that the I/O bits
- start at CRU bit 0 and the clock/interrupt bits start at CRU bit 16.
- This was done so that the first I/O bit could be used to enable/disable
- GRAND RAM and still be compatible with the 99/4A DSR lookup protocol,
- which uses CRU bit 0 to enable or disable a given DSR memory space.
- Due to the sophisticated nature of the 9901, a full discussion of it's
- capabilities is beyond the scope of this document. The reader desiring
- this information should refer to the TMS9901 Programmable Systems
- Interface booklet, or the 9900 Family Systems Design handbook, both
- published by Texas Instruments.
-
- Designed by Sofmachine Inc. 2-2 Copyright 1987 DataBioTics
-
-
-
- GRAND RAM TECHNICAL DATA GRAND RAM Architecture
-
- 6. Real-time Clock Access
- The clock chip which is compatible with GRAND RAM is the Dallas
- Semiconductor DS1215. Access to the chip is through the clock read and
- write addresses, specified above. The clock is accessed through a 1-bit
- interface which is connected to the most significant bit, DB7, of the
- buffered P-box data bus. Timekeeping features include: time resolution
- of timekeeping. For complete programming information, consult the DS1215
- data sheet.
-
- 7. Interrupts
- GRAND RAM provides full interrupt capability, controlled by the TMS9901.
- There are two possible sources of interrupts:
- a. The 9901 Interval Timer can be programmed to interrupt on level 3. If
- the interval Timer interrupt is enabled, the INT3 line is disabled.
- b. The six external interrupt pins which are connected to the Device
- Expansion Port may cause an interrupt if the proper option board is
- attached. The interrupt 1 input (-INT1) has an onboard pullup
- resistor. All interrupt control is as described in the TMS9901
- manual, with the exception of one extra level of hardware masking. No
- interrupts will occur on the 99/4A PEB bus unless CRUBIT3 is set to a
- zero. This allows the interval timer to be used as a precisely
- controlled hardware strobe for option boards connected to the Device
- Expansion Port, without actually generating an interrupt to the CPU.
- After power-up CRUBIT3 is set high, thus disabling 9901 interrupts to
- the CPU until explicitly enabled by the software.
-
- Designed by Sofmachine Inc. 2-3 Copyright 1987 DataBioTics
-
-
-
- GRAND RAM TECHNICAL DATA Hardware Design
- SECTION 3
-
- The hardware to implement GRAND RAM is very modular. All IC's perform one or
- memory, multiplexer, register, miscellaneous logic.
-
- 1. Buffering
- Initially, the address, control, and data lines from the peripheral bus
- are buffered by 74LS244 (Address Control) and 74LS245 (Data) bus driver
- chips.
- 2. Miscellaneous Logic
- To ensure that addresses are stable when MEMEN is asserted, the leading
- edge of MEMEN is synchronously delayed for approximately 135 nS. This is
- accopmplished with an inverter (74LS05), and a D flip-flop (74LS74) which
- is clocked by the phase 3- bus clock.
- 3. Decoding/PALs
- A delayed version of MEMEN (described earlier) and the buffered control
- and address lines are the inputs to the two PALS. These PALs provide the
- signals required for controlling GRAND RAM. The following signals and
- functions are provided by the PALs:
- a. Clock strobes for the two 8-bit memory page registers.
- b. Output enable strobes for the two 8-bit memory page registers.
- c. Enable strobe for the two 74LS138 memory chip select decoders.
- d. Chip select for RAM chip #0.
- e. Chip select for the Real-time clock chip.
- f. Chip select for the TMS9901 peripheral chip.
- g. Multiplex control for >4000 - >4FFF RAM access.
- h. Protected Write Enable for RAMs.
- i. Local data bus enable control.
- j. Buffered tri-state remote data bus enable.
- k. Pre-decoded GRAM signal for future cartridge emulation.
- l. Pre-decoded Expansion I/O strobe (-EXPIO).
- 4. Page Registers
- The two page registers are implemented with octal, edge-clocked latches
- with tri-state outputs (74LS374). The register output enable controls
- are used to select which page register is addressing the GRAND RAM
- memory, thus providing a zero-chip multiplexing function.
- 5. Special Functions
- The TMS9901 peripheral interface is straitforward, except for the
- transposed top and bottom internal mapping. This is implemented by
- inverting the most significant address line (BA10) to the 9901. The
- real-time clock chip is mapped so that no unprogrammed accesses can
- occur, which is a hazard due to the 9900 read-before-write bus timing.
-
- Designed by Sofmachine Inc. 3-1 Copyright 1987 DataBioTics
-
-
-
- GRAND RAM TECHNICAL DATA Hardware Design
- 6. Memory
- The memory chips are 32K X 8 SRAMs, and are connected to a fully buffered
- bus. Also, the chip select and write enable lines are pulled up during
- power down to minimize standby power consumption. Chip select decoding
- is provided by two 74LS138 decoders. During any accesses to GRAND RAM at
- addresses >4000->4FFF, the first 4K of RAM chip #0 will always be
- selected. Half of a 74LS244 buffer is used to force the address to the
- first 4K of a memory chip, and the PAL always selects RAM chip #0 during
- accesses to >4000->4FFFF. During accesses to >5000-57FF, page register
- #0 addresses both the RAMs and chip select decoders, causing the
- appropriate 2K page to be selected. Accesses to >5800->5FFF cause page
- register #1 to select a 2K page, in the same manner as page register #0.
- 7. Power Supply
- Grand Ram contains two seperate power busses. The first, the logic power
- bus, supplies power to all the TTL and PAL chips. The RAMs and clock
- chip recieve power from the memory power bus. The memory power bus must
- supply power when the P-box is turned off. Diode D3 disconnects the
- memory power bus from the rest of the system during power-down, assuring
- minimal current drain from the battery. When the P-box is powered up,
- D3 and R4 provide a trickle charging network for the battery. The three
- regulator shunt resistors, R5-R7, supply some of the regulated 5 volt
- logic current, thereby reducing the power (heat) dissipated in the
- regulator. A voltage divider, composed of R2, R3, and C2, supplies the
- appropriate backup voltage to the clock chip.
- 8. Cartridge Emulator Port
- The design goal for the Cartridge Emulator Port (CEP) is to provide all
- the signals required to operate a cartridge. The Cartridge Emulator, an
- optional daughterboard which plugs into the CEP, will function as a
- loadable cartridge port. With the proper software installed in GRAND
- RAM, cartridges could be loaded from RAMdisk or floppy disk into the
- Cartridge Emulator and executed, without ever having a cartridge plugged
- into the console! A menu of the user's favorite cartridges could be
- displayed automatically after the TI99/4A is turned on. This would
- allow the user to select a particular cartridge with a single keypress.
- The Cartridge Emulator Port provides the following support:
- a. Four 8K-blocks of memory, which are banked into the cartridge CPU
- address space from >6000->7fff. Some of the TMS9901 I/O lines are
- used for controlling the which 8K block is selected. The banking
- architecture supports ame 99% of the existing cartridges.
- b. 64K of GRAM, partitioned at the console/cartridge address boundary.
- This allows for independent control of both console and cartridge
- grom emulation.
-
- Designed by Sofmachine Inc. 3-2 Copyright 1987 DataBioTics
-
-
-
- GRAND RAM TECHNICAL DATA Hardware Design
-
- Cartridge Emulator Port (CEP ) Connector Definition
-
- Pin # Name Type Function/Definition
- ---------------------------------------------------------------
- 1,2 +U8V PWR Unregulated 8 volt power input
- 3-10 BD7-BD0 I/O Buffered Data bus. DB7 is Least sig bit
- 11-26 BA15-BA0 Out Buffered Address Bus. BA15 is least sig bit
- 27 -BMEMEN Out Buffered and reclocked P-box -MEMEN (active low)
- 28 -BWE Out Buffered P-box -WE (active low write enable)
- 29 -LCLDBEN In LoCaL Data Bus ENable (active low). When active,
- this causes the data bus drivers to be turned on.
- Drive this line with an open-collecter source.
- 30 -BDBIN Out Buffered, active low, version of P-box DBIN
- 31 -ABC Out Active (low) when P-box extended memory bits
- A, B, and C are all equal to 1.
- 32 -GRAMSEL Out Active (low) whenever an access occurs in
- the grom space (>9800->9FFF).
- 34 CRUBIT4 Out =0 enable gram emulation for console
- groms (>0000->5FFF)
- =1 disable emulation for console groms
- 33 CRUBIT5 Out =0 enable gram emulation for cartridge
- groms (>6000->FFFF)
- =1 disable emulation for cartridge groms
- 36 CRUBIT6 Out =0 enable writes to emulation gram
- =1 disable writes to emulation gram
- 35 CRUBIT7 Out =0 enable emulation of cartidge rom/ram
- memory from >6000->7FFF.
- =1 disable emulation of cartridge rom/ram memory
- 38 CRUBIT8 Out =0 CRUBIT9 pages in the upper or lower
- 8K block for emulation of cartridge rom/ram.
- Used when loading up a cartridge, or
- developing new applications.
- =1 the value of Address bit 14 during
- the last write to cartridge ram/rom selects
- the upper or lower 8K block of emulation
- rom/ram. This maintains compatibility with
- existing cartridges.
- 37 CRUBIT9 Out =0 selects the lower 8K block (out of 16K)
- =1 selects the upper 8K block (out of 16K)
- 40 CRUBIT10 Out =0 selects the lower 16K block (out of 32K)
- =1 selects the upper 16K block (out of 32K)
- This bit, along with either CRUBIT9 or the latched
- value of BA14, form a page address, which selects
- of the four 8K blocks from the available 32K
- of emulation ram.
- 39 CRUBIT11 Out =0 enable writes to cartridge emulation ram/rom
- at addresses >6000 - >6FFF. (for ram emulation)
- =1 disable writes to cartridge emulation ram/rom
- at addresses >6000 - >6FFF. (for rom emulation)
- 42 CRUBIT12 Out =0 enable writes to cartridge emulation ram/rom
-
- Sofmachine, Inc. 3-4
-
- GRAND RAM TECHNICAL DATA Hardware Design
-
- at addresses >7000 - >7FFF. (for ram emulation)
- =1 disable writes to cartridge emulation ram/rom
- at addresses >7000 - >7FFF. (for rom emulation)
- 41 N/C No connection
- 43,44 GROUND PWR Ground for power and signals
- 45,45 N/C No connection
-
- 9. Device Expansion Port
- The design goal for the Device Expansion Port (DEP) is
- to provide all the signals required for a general purpose
- I/O expansion capability. The DEP provides the following
- features:
- a. 224 bytes of predecoded memory-mapped I/O space with
- an active low polarity.
- b. Three CRU single bit I/O ports.
- c. Five interrupt inputs, which are also usable as single
- CRU inputs bits/
- d. Access to the audio input of the 99/4A sound chip.
- This allows add-on boards to output their sound
- through the normal 99/4A audio channel, in the same
- fashion as the speech peripheral.
-
- Sofmachine, Inc. 3-5
-
-
-
-
- GRAND RAM TECHNICAL DATA Hardware Design
-
-
- Device Expansion Port (DEP ) Connector Definition
-
- Pin # Name Type Function/Definition
- ---------------------------------------------------------------
- 1,2 +U8V PWR Unregulated 8 volt power input
- 3-10 BD7-BD0 I/O Buffered Data bus. DB7 is Least sig bit
- 11-18 BA15-BA8 Out Partial Buffered Address Bus. BA15 is least sig bit
- 19 -EXPIO Out Active (low) when an address access in the
- range of >4F00 - >4FDF, and the proper CRU bits
- are set up. See the memory map for required
- CRU values to activate this signal.
- 20 -BWE Out Buffered P-box -WE (active low write enable)
- 21 -PH3 Out Buffered 3 MHz negaged phase 3 P-box signal
- 22 -BDBIN Out Buffered, active low, version of P-box DBIN
- 23 READY In Ready to the 99/4A processor. To extend a memory
- cycle, drive this line low with an open-collector
- output.
- 24 -INT1 In Active low interrupt input to the TMS9901
- INT1 input. This line is pulled up to +5V
- with a resistor on the GRAND RAM board.
- 26 -INT9901 Out Active low interrupt output from the TMS9901
- With proper software, this output can be programmed
- to supply a pulse at a rate determined by the
- 9901 interval timer. This would be useful
- as a very stable and controllable sample
- pulse for A/D and D/A converters, etc.
- 25 CRUBIT13 I/O General-purpose CRU I/O bit
- 28 CRUBIT14 I/O General-purpose CRU I/O bit
- 27 CRUBIT15 I/O General-purpose CRU I/O bit
- 29 AUDIO In External audio input to console sound chip
- 30 -INT2 In Interrupt or general purpose input
- 32 -INT4 In Interrupt or general purpose input
- 31 -INT5 In Interrupt or general purpose input
- 34 -INT6 In Interrupt or general purpose input
- 33 N/C No Connection
- 35,36 GND PWR Ground for power and signals
- 37,38 N/C No connection
-
- Sofmachine, Inc. 3-6
-
-
-
-
- GRAND RAM TECHNICAL DATA Hardware Design
-
- MEMORY MAP
-
- +--------------------+--------------------+
- | CRUBIT0 = 1 | CRUBIT0 = 1 |
- | CRUBIT2 = 0 | CRUBIT2 = 1 |
- |--------------------+--------------------|
- >4000| |
- | RAM PAGE 0 |
- >47FF| |
- |--------------------|--------------------|
- >4800| |
- | RAM PAGE 1 |
- >4EFF| |
- |--------------------|--------------------|
- >4F00| | |
- | EXPANSION | |
- | PORT I/O | |
- >4FDF| | |
- |--------------------| |
- >4FEO| PAGE REGISTER #0 | |
- |--------------------| |
- >4FE1| UNUSED | |
- |--------------------| |
- >4FE2| PAGE REGISTER #1 | |
- |--------------------| |
- >4FE3| UNUSED | |
- |--------------------| |
- >4FE4| CLOCK WRITE | RAM PAGE 1 |
- |--------------------| |
- >4FE5| UNUSED | |
- |--------------------| |
- >4FE6| CLOCK READ | |
- |--------------------| |
- >4FE7| UNUSED | |
- |--------------------| |
- >4FE8| >4FE0 - >4FE7 | |
- | is mirrored in | |
- | in this space | |
- >4FFF| | |
- |--------------------|--------------------|
- >5000| |
- | RAM PAGE SELECTED BY |
- | PAGE REGISTER #0 |
- >57FF| |
- |-----------------------------------------|
- >5800| |
- | RAM PAGE SELECTED BY |
- | PAGE REGISTER #1 |
- >5FFF| |
- |-----------------------------------------|
-
- Sofmachine, Inc. 3-7
-
- ============================================================================
- DTIHM038
-
- THE PAL12L6 OF THE MYARC FLOPPY DISK CONTROLLER
- @Paolo Bagnaresi, February 1990 - % -
- THE PAL12L6 OF THE MYARC FLOPPY DISK CONTROLLER
- ===============================================
- Author: Paolo Bagnaresi
- Via J.F. Kennedy 17
- 20097 San Donato Milanese
- Italy
-
- Date: February 10, 1990
-
- Disclaimer: although this document has been written to the
- best of my knowledge, it may be unaccurate or misleading.
- It is also unknown to me if the Myarc program burned inside
- the PAL has been copyrighted. If it has, you may not be
- allowed to use this document to duplicate the Myarc FDC PAL
- and usage or distributing of this document may be prohibited
- by the law. In any case, the informations provided by this
- document have been entirely worked out without assistance or
- help from Myarc.
-
- Purpose of this document
- ------------------------
-
- This document will explain the usage of the PAL12L6 chip
- (National Semiconductor, Monolithic Memories, etc.) located
- inside the Myarc FDC.
-
- The PAL12L6 is a 20 pin, 12 dedicated inputs, 6
- combinatorial outputs, Programmable Array Logic.
-
- Input pins are pins # 1,2,3,4,5,6,7,8,9,11,12,19.
- Output pins are pins # 13,14,15,16,17,18.
-
- This PAL acts as a "glue logic" inside the Myarc FDC. It
- has been used by Myarc to enable the following devices
- inside the FDC:
-
- 1) 74LS259 when a CRU OUT cycle the CRU address range >1100
- - >11FF was executed
-
- 2) 74LS251 when a CRU IN cycle the CRU address range >1100
- - >11FF was executed
-
- 3) 2764 Eprom when a Memory cycle in the address range
- >4000 - >4FFF was executed
-
- 4) 2024 Static Ram when a Memory cycle in the address
- range >5000 - >57FF was executed
-
- 5) WD1770 Read/Write Registers when a Memory cycle in the
- address range >5F00 - >5FFF was executed
-
- First off, I will describe how the PAL has been programmed.
- Then, the fuse blowing layout will be translated into a more
- understandable circuit layout and the suitable explanations
- will be given.
-
- The following SPRINT XPLOT listing has been obtained by
- analysing the PAL12L6 of Myarc Floppy Disk Controller by the
- "SPRINT PAL Programmer". Inspection was possible since Myarc
- did not blow the Security Fuse on the PAL after
- programming.
-
- The SPRINT XPLOT listing has been provided by Roberto
- Maffioletti, Via Magellano 8, 24040 Stezzano, Bergamo,
-
- Italy. I would like to thank Roberto for his invaluable
- help.
- *------------------------------------------------------------
- SPRINT XPLOT listing of device N.S. DMPAL12L6 file
-
- 0000 0000 0011 1111 1111 2222 2222 2233
- term pin 0123 4567 8901 2345 6789 0123 4567 8901
-
- 8 18 -XX- X--X -X -X -X -X ---X --X-
- 9 XXXX XXXX XX XX XX XX XXXX XXXX
- 10 XXXX XXXX XX XX XX XX XXXX XXXX
- 11 XXXX XXXX XX XX XX XX XXXX XXXX
-
- 16 17 X-X- X--X X- X- X- -X X--- X--X
- 17 XXXX XXXX XX XX XX XX XXXX XXXX
-
- 24 16 -XX- X--X -X -X -X -X ---- --X-
- 25 XXXX XXXX XX XX XX XX XXXX XXXX
-
- 32 15 ---- ---X X- -- -- -X ---- X--X
- 33 XXXX XXXX XX XX XX XX XXXX XXXX
-
- 40 14 ---- X--X X- -X -- -X ---- X--X
- 41 XXXX XXXX XX XX XX XX XXXX XXXX
-
- 48 13 ---- -X-X X- -- -- -X ---- X--X
- 49 XXXX XXXX XX XX XX XX XXXX XXXX
- 50 XXXX XXXX XX XX XX XX XXXX XXXX
- 51 XXXX XXXX XX XX XX XX XXXX XXXX
-
- Note: X = Fuse not blown
- - = Fuse blown
- *------------------------------------------------------------
- Now, from the above SPRINT XPLOT listing you can easily
- build back the Fuse Link Map by marking an "X" on the logic
- diagram of the PAL12L6 (the diagram has not provided with
- this document, since its complexity far exceeds the drawing
- capabilities of TI-Writer). Please refer to the National
- Semiconductor "PROGRAMMABLE LOGIC DEVICES, Databook and
- Design Guide", for the PAL12L6 Fuse Link Map Diagram.
-
- From the so otained diagram, we will try to describe to what
- input pin each output pin in the PAL is connected.
-
- In the following drawing, the AND gate is represented as such
-
- I ---------|\ Note: the "-----0|" means
- n --------0| \ that the input
- p ---------| )-- Output signal is negated
- u ---------| / before being used
- t ---------|/ by the PAL array.
-
- Also, the OR gate is represented as such:
- \ \
- Input --)>---- Output Input --)>0---- Negated Output
- / /
- =============================================================
- PAL PIN 18
- ----------
- Line Input AND OR Output Output
- Name Pin Pin Description
-
- A07_B--------------1---|\ To G* (pin 14
- A06_B--------------2--0| \ Chip Enable)
- A03----------------3---| \ of U10
- A01----------------4---| \ 74LS259.
- A04_B--------------5--0| \ \
- A05_B--------------6--0| )--)>0---Pin # 18
- A00----------------7--0| / /
- MEMEN*------------11---| /
- CRUCLK------------12---| /
- A02---------------19---| /
-
- Address Lines decode
- --------------------
- Address Line # 0123 4567
- Weight 8421 8421
- Address value 0001 0001
- Hex Addr. value >11xx
-
- Output pin purpose
- ------------------
- Sees if a CRU OUT data bit is aimed to the FDC card.
- CRU OUT data bit coming from 9900 are accepted by the card
- if :
-
- a) Address is >11xx in the Address Lines
- b) MEMEN* is HIGH (inactive)
- c) CRUCLK* is LOW (active)
-
- =============================================================
- PAL PIN 17
- ----------
- Line Input AND OR Output Output
- Name Pin Pin Description
-
- A07_B--------------1---|\ To CS* (pin 1
- A06_B--------------2---| \ Chip Enable)
- A03----------------3---| \ of U6 WD1770
- A01----------------4---| \ Floppy Disk
- A04_B--------------5---| \ \ Controller.
- A05_B--------------6---| )--)>0---Pin # 17
- A00----------------7--0| / /
- A15_B_CRU_OUT------8---| /
- CRU_BIT_ZERO_ON----9---| /
- MEMEN*------------11--0| /
- A02---------------19--0|/
-
- Address Lines decode
- --------------------
- Address Line # 0123 4567
- Weight 8421 8421
- Address value 0101 1111
- Hex Addr. value >5Fxx
-
- Output pin purpose
- ------------------
- Sees if a memory cycle (Memory Read/Write) is aimed to the
- Read/Write Registers of WD1770 chip (Floppy Disk controller) in
- the FDC card.
-
- Condition is true if:
- a) Address is >5Fxx in the Address Lines
- b) Address is also ODD (not EVEN)
- c) MEMEN* is LOW (active)
- d) The card has been already opened. That is, if the CRU BIT
- ZERO at Base >1100 has been already turned to ON state.
-
- =============================================================
- PAL PIN 16
- ----------
- Line Input AND OR Output Output
- Name Pin Pin Description
-
- A07_B--------------1---|\ To STROBE
- A06_B--------------2--0| \ (Pin 7) of
- A03----------------3---| \ U5 74LS251
- A01----------------4--0| \ Data Selector
- A04_B--------------5--0| \ \
- A05_B--------------6--0| )--)>0---Pin # 16
- A00----------------7--0| / /
- MEMEN*------------11---| /
- A02---------------19--0| /
- | /
- |/
- Address Lines decode
- --------------------
- Address Line # 0123 4567
- Weight 8421 8421
- Address value 0001 0001
- Hex Addr. value >11xx
-
- Output pin purpose
- ------------------
- Sees if a CRU IN cycle is aimed to the FDC card.
- Enables sending CRU data bit from the Myarc FDC card to the
- 9900, through the CRUIN data line, if:
-
- a) Address is >11xx in the Address Lines
- b) MEMEN* is HIGH (inactive)
-
- Note: in the Myarc FDC card, the CRUIN cycle decoding is
- equal to the CRUOUT cycle decoding. This means that during a
- CRUOUT cycle in the >11xx CRU address range the U5 74LS251
- is selected anyway and a DATA BIT is sent to the 9900 as if
- CRUIN cycle had been executed.
-
- However, this approach does no harm since the the CRUIN line
- is a dedicated line and the 9900 simply ignores the bit
- value being presented on the CRUIN line during a CRUOUT
- cycle.
-
- =============================================================
- PAL PIN 15
- ----------
- Line Input AND OR Output Output
- Name Pin Pin Description
-
- A01----------------4---|\ To RDBENA* Bus
- A00----------------7--0| \ \ Pin in the PEB
- CRU_BIT_ZERO_ON----9---| )--)>0---Pin # 15
- MEMEN*------------11--0| / /
- A02---------------19--0|/
-
- Address Lines decode
- --------------------
- Address Line # 012
- Weight 842
- Address value 010
- Hex Addr. value >4xxx - >5xxx
-
- Output pin purpose
- ------------------
- Sees if a memory cycle is aimed to the FDC card. Asserts REMOTE
- DATA BUS ENABLE (RDBENA*) to its active state (LOW) if:
-
- a) Address is in the range >4xxx - >5xxx
- b) MEMEN* is LOW (active)
- c) The card has been already opened. That is, if the CRU BIT
- ZERO at Base >1100 has been already turned to ON state.
-
- =============================================================
- PAL PIN 14
- ----------
- Line Input AND OR Output Output
- Name Pin Pin Description
-
- A03----------------3---|\ To CE* (pin
- A01----------------4---| \ 18, Chip
- A04_B--------------5--0| \ \ Enable) of
- A00----------------7--0| )--)>0---Pin # 14 U2 2016
- CRU_BIT_ZERO_ON----9---| / / Static Ram
- MEMEN*------------11--0| / (2 Kbytes)
- A02---------------19--0|/
-
- Address Lines decode
- --------------------
- Address Line # 0123 4
- Weight 8421 8
- Address value 0101 0
- Hex Addr. value >50xx - >57xx
-
- Output pin purpose
- ------------------
- Sees if a memory cycle is aimed to the 2 K Static Ram in FDC
- card. Enables the 2 K Static Ram in the address range >50xx -
- >57xx if:
-
- a) Address is in the range >50xx - >57xx
- b) MEMEN* is LOW (active)
- c) The card has been already opened. That is, if the CRU BIT
- ZERO at Base >1100 has been already turned to ON state.
-
- =============================================================
- PAL PIN 13
- ----------
- Line Input AND OR Output Output
- Name Pin Pin Description
- |\
- A03----------------3--0| \ To CE* (pin
- A01----------------4---| \ \ 20, Chip
- A00----------------7--0| )--)>0---Pin # 13 U3 2764
- CRU_BIT_ZERO_ON----9---| / / Eprom
- MEMEN*------------11--0| / (8 Kbytes)
- A02---------------19--0|/
-
- Address Lines decode
- --------------------
- Address Line # 0123
- Weight 8421
- Address value 0100
- Hex Addr. value >4xxx
-
- Output pin purpose
- ------------------
- Sees if a memory cycle is aimed to the 8 K Eprom in FDC
- card.
-
- Enables the 8 K Eprom in the address range >4xxx if:
-
- a) Address is in the range >4000 - >4FFF
- b) MEMEN* is LOW (active)
- c) The card has been already opened. That is, if the CRU BIT
- ZERO at Base >1100 has been already turned to ON state.
-
- Note: The Eprom is logically divided into two banks, each
- being 4 KBytes long and each residing in the address range
- >4000 - >4FFF. When the Eprom is accessed, which Eprom bank
- will be paged-in depends on the state of CRU OUT Bit # 3,
- which has also another function: it enables the Double
- Density when reading/writing from/to Floppy Disk.
-
- This particular hardware arrangements creates a problem:
- the software residing in the Eprom cannot directly turn
- on/off the Single/Double Density. If it does, the other
- Eprom bank may get turned on and the microprocessor would
- start executing the code residing in the other side of the
- Eprom.
-
- The problem is software solved by relocating a short portion
- of code in the Scratch Pad area (>8300 - >83FF) just prior
- to accessing the Floppy Disk Drive. Then, execution will be
- transfered to this code relocated in the Scratch Pad area.
- The selected density can be safely enabled and, after the
- transfer from/to the Floppy Disk has been carried out, the
- density pertaining to the Eprom bank being used will be
- restored to its previous state. Eventually, a return to the
- original Eprom bank will be performed.
-
- Also, it's worth noting that the code relocation to the
- Scratch Pad area ensures a 16 bit fast execution, as opposed
- to the 8 bit/wait state/8 bit slow execution that would take
- place for code executing from inside the Eprom.
-
-
- * Filename : MYARC-FDC1 - Actual code example is on files 80T-INIT-A thru D
- ****************************************************************************
- * MYARC DISK CONTROLLER CRU INFORMATIONS
- ********************************************************************************
-
- Paolo Bagnaresi
- Via Kennedy 17
- 20097 San donato Milanese
- ITALY - Phone (02)-514.202
-
- ********************************************************************************
- The following informations are accurate and to the best of my knowledge.
- However, you should not assume they are free from errors. I will gladly accept
- any correction that you will send to my address. Please feel free to contact me
- on this matter. I am trying to share informations on this subject in the hope
- of receiving some feed back from other users: I would like to know YOUR
- PERSONAL EXPERIENCES. PLEASE WRITE ME BACK.
- ********************************************************************************
-
- The MYARC Disk Controller (from now on MDC) is a card to be fitted in the PEB.
- It provides DS/DD diskette formatting and some other useful routines.
-
- This doc deals primarily with the CRU arrangement onf the MDC, that is somehow
- different from TI, ATRONIC and CORCOMP disk Controller.
-
- The MDC has usually a CRU base address of >1100. Inside, the MDC you can see,
- among the other chips:
-
- - 1 EPROM 4164 (8 Kbytes)
- - 1 2 Kbyte Ram.
- - 1 WD 1770 Disk controller
-
- The EPROM is banked into two 4 k portions. Each portion is addressed between
- >4000 and >4FFF. CRU Address >1100 turns on the first bank.
-
- Additionally, CRU address >1106 turns on the second bank.
-
- The 2 K Ram is addressed from >5000 to >57FF. Addresses between >5800 - >5EFF
- are unused. Adresses between >5F00 and >5FFF are reserved for I/O mapping (WD
- 1770 gates, see below).
-
- Banking the 4 K Eprom will not affect the Ram. Thus, the Ram can be "seen" from
- both Eprom banks. This is very convenient. The Ram is used to keep informations
- relevant to drive usage and to save part of the Scracth pad. Also, the Ram
- will act as temporary Buffer, for a read from disk.
-
- The usage of WD 1770 chip (28 pins) is fully described in the WESTERN DIGITAL
- "1986 Storage Management Products Handbook". This is the address of Western
- Digital:
-
- WESTERN DIGITAL CORPORATION
- 2445 McCabe Way
- Irvine, CA 92714, USA
- Phone (714)-863.0102. TWX 910-595-1139
-
- GATES (HARDWARE MAPPED GATES TO DISK CONTROLLER)
- ================================================
- These are special CPU RAM addresses that act as a gate to and from the disk
- controller WD 1770. They are 8 bits gates (a full byte). Please refer to the
- Western Digital Manual (see above) for a full description on how to use these
- gates.
-
- In the following range of addresses, only odd byte addresses between >5F01 and
- >5F07 are fully decoded; other odd address are the copy of odd addresses
- between >5F01 and >5F07: thus, >5F09 should act as >5F01. The even addresses on
- the same range are without effect.
-
- >5F01 = READ : STATUS REGISTER.
- = WRITE : COMMAND REGISTER.
-
- >5F03 = WRITE : CURRENT TRACK ADDRESS.
-
- >5F05 = WRITE : NEEDED SECTOR REGISTER. See a note below.
-
- >5F07 = READ : READ DATA GATE
- = WRITE : WRITE DATA GATE
-
- In the following descrition the CRU BASE is assumed to be >1100. All SBO, SBZ,
- TB, LDCR, STCR will have >1100 as a CRU BASE.
-
- TB INSTRUCTIONS (Test Bit istructions)
- ======================================
- CRU
- BASE + 0 = TB 0 : COMMAND COMPLETED TEST. After issuing a Command to >5F01,
- COMMAND REGISTER GATE, you may want to check if the command has
- already been performed . This will avoid issuing a new command
- before completion of the current command.
-
- The TB will return 1 if Command has been completed, 0 if not
- completed. Example:
- TB 0
- JEQ DONE
- CRU
- BASE + 2 = TB 1 : DATA REQUEST READY TEST. When reading or writing data to
- the >5F07 READ/WRITE DATA GATE, some time may elapse before the
- data is processed by the WD 1770 chip. By checking this CRU BIT you
- will know when a new data is ready to be processed. If a 1 is
- returned, then the gate is READY to process a new data. If a 0 is
- returned, the gate is not ready. Example:
-
- TB 1
- JEQ READY
- CRU
- BASE + 4 = TB 2 : VERIFY HARD DISABLED if set to ZERO. Myarc suggests to run
- a jumper, inside the Myarc Disk Controller, between pin # 2 of U5
- [a 74LS251] and ground to disable VERIFY after a write. The means
- for the software to detected if this jumper has been run is a TB 2.
- The only time this bit is tested is after a Write Sector.
-
- Example :
- TB 2
- JNE DISABL (Jump if Verify is DISABLed)
-
- BASE + 6 = TB 3 : ?? unknown. Apparently is never used.
-
- CRU
- BASE + 8 = TB 4 : DRIVE # 4 80 TRACK DIP-SWITCH SELECTED TEST. This CRU Bit
- reflects the condition of the internal Dip-Switch # 4, relative to
- drive # 4 (can be either on ON or on OFF position). It returns 1 if
- the dip-switch is OFF, 0 if the dip-switch is ON. The dip-switch
- has to be turned on if the corresponding drive is an 80 track drive
- (such as TEAC FD 55 F). Please note that this CRU BIT depends only
- on the position of the corresponding Dip-Switch: it is not capable
- of really detecting the kind of drive connected. In other words, it
- is entirely possible that user has a 40 track drive and by mistake
- turned on the dip-switch: then the softwre will act as if an 80
- track is connected .... with all the problem you can easily
- imagine.
-
- Example :
- TB 4
- JNE TRAK80 jump if DIP-SWITCH is OFF.
-
- CRU
- BASE + 10 = TB 5 : DRIVE # 3 80 TRACK DIP-SWITCH SELECTED TEST. This CRU bit
- reflects the condition of the internal Dip-Switch # 3,
- relative to drive # 3 (can be either on ON or on OFF
- position). It returns 1 if the dip-switch is OFF, 0 if the
- dip-switch is ON. See explanations for TB 4.
-
- Example:
- TB 5
- JNE TRAK80 jump if DIP-SWITCH is OFF.
-
- CRU
- BASE + 12 = TB 6 : DRIVE # 2 80 TRACK DIP-SWITCH SELECTED TEST. This CRU bit
- reflects the condition of the internal Dip-Switch # 2,
- relative to drive # 2 (can be either on ON or on OFF
- position). It returns 1 if the dip-switch is OFF, 0 if the
- dip-switch is ON. See explanations for TB 4.
-
- Example:
- TB 6
- JNE TRAK80 jump if DIP-SWITCH is OFF.
-
- CRU
- BASE + 14 = TB 7 : DRIVE # 1 80 TRACK DIP-SWITCH SELECTED TEST. This CRU bit
- reflects the condition of the internal Dip-Switch # 1,
- relative to drive # 1 (can be either on ON or on OFF
- position). It returns 1 if the dip-switch is OFF, 0 if the
- dip-switch is ON. See explanations for TB 4.
-
- Example:
- TB 7
- JNE TRAK80 jump if DIP-SWITCH is OFF.
-
- SBO, SBZ INSTRUCTIONS (Set cru Bit to One, Set cru Bit to Zero)
- ===============================================================
-
- CRU
- BASE + 0 = SBO 0 : ENABLE MYARC DSR CARD
- SBZ 0 : DISABLE MYARC DSR CARD
-
- CRU
- BASE + 2 = SBO 1 : ?? (may be WD 1770 Chip Enable)
- SBZ 1 : ?? ( " " " " Chip Disable)
-
- CRU
- BASE + 4 = SBO 2 : ENABLE SECOND SIDE OF MAGNETIC HEAD
- SBZ 2 : ENABLE FIRST SIDE OF MAGNETIC HEAD
-
- CRU
- BASE + 6 = SBO 3 : ENABLE SINGLE DENSITY AND BANK 2 OF EPROM MEMORY ADDRESSES
- BETWEEN >4000 AND >4FFF.
- SBZ 3 : ENABLE DOUBLE DENSITY AND BANK 1
- BETWEEN >4000 AND >4FFF.
-
- CRU
- BASE + 8 = SBO 4 : ENABLE DRIVE # 1
- SBZ 4 : DISABLE DRIVE # 1
-
- CRU
- BASE + 10 = SBO 5 : ENABLE DRIVE # 2
- SBZ 5 : DISABLE DRIVE # 2
-
- CRU
- BASE + 12 = SBO 6 : ENABLE DRIVE # 3
- SBZ 6 : DISABLE DRIVE # 3
-
- CRU
- BASE + 14 = SBO 7 : ENABLE DRIVE # 4
- SBZ 7 : DISABLE DRIVE # 4
-
- >5F05 GATE (HARDWARE MAPPED SECTOR GATE TO DISK CONTROLLER)
- ===========================================================
- The sector # to write to disk Gate is the sector # relative to the track
- (INTERNAL SECTOR #). When a diskette is initialized, each track contains
- several sectors (they span from 0 up to either 9 or 18, depending on the
- density you are using). So, in each track, the sector # is numbered from 0 up
- to 18. When accessing a LOGICAL sector number, say sector LOGICAL SECTOR # 70,
- you have to compute the corrisponding TRACK # and INTERNAL SECTOR #. For
- instance, if the diskette has been initialized to 18 sectors, then
-
- LOGICAL SECTOR 70 is = TRACK # 3 (Integer of 70/18)
- = INTERNAL SECTOR 16 (Remainder of 70/18)
- Thus, you will write 16 to the >5F05 SECTOR GATE and
- 3 to the >5F03 TRACK GATE.
-
- INTERNAL RAM ORGANIZATION
- =========================
- As said above, the 2 K RAM inside the MDC (>5000 - >57FF) it is used to store
- information relevant to Disk Management.
-
- The following map is a partial description of the use of this RAM. Further
- infos are needed to complete the map. Please help!
-
- >5000 - >501F = Workspace used by Sector READ/WRITE and Disk FORMATTING.
-
- >5020 - >508B = Save SCRATCH PAD HIGH AREA (>6C bytes from >8394 through
- >83FE).
-
- >508C - >50AE = Subprogram or Program invoked by the DSRLNK. Here will be
- stored the Subprogram you call (Ex. >0111 for a Disk
- Formatting routine), or a full PAB description if you call a
- Program (>0500,>1000,>0000,>2100,>000A,'DSK1.UTIL1' for a LOAD
- MEMORY IMAGE PROGRAM of a file 'UTIL1' from Drive 1).
-
- >50AF - = Byte: # of maximum RETRY during a READ/WRITE sector. It is
- initialized to 5 upon entering the READ/WRITE sector routine.
- The Read/Write Sector software will enable retrying 5 times
- before issuing error when accessing a sector. A LOST DATA
- during a read or a write sector will not modify this value
- (you still have 5 more chances). After a Write Sector error,
- Sector Zero of the diskette is read. If a new error is issued
- after reading sector Zero, then DENSITY value is changed and
- sector Zero is accessed again. This DENSITY swapping and
- reding Sector ZERO is continued until either sector zero is
- read succesfully, or RETRY times remains greater than ZERO.
- After that, a final error is issued to the routine that called
- the READ/WRITE sector..
-
- On the other hand, if Sector Zero is read succesfully, then
- the original assigned sector is accessed again. A new error
- will restart the ZERO READ SECTOR PROCEDURE.
-
- >50B0 - >50B1 = Drive # accessed (at >50B1). Usually >50B0 is zero.
-
- >50B2 = Byte: if 0 then SECTOR ZERO doesn't need to be updated. If
- different from zero, then SECTOR ZERO needs updating.
-
- >50B3 = Byte: Drive # previously accessed. After computer RESET
- is always zero.
-
- >50B4 - >50B5 = unknown
-
- *----- DISKETTE TYPE INFORMATION AREA ---------------------------------------*
-
- *----- DRIVE 1 -----*
-
- >50B6 - >50B7 = Word: Drive 1 Maximum # of sector/disk. This value is taken
- from sector ZERO, offset >10, of the diskette you are using.
- It is always updated whenever you access sector ZERO.
-
- It will be:
- >0168 for 360 sectors
- >0280 " 640 "
- >02D0 " 720 "
- >0500 " 1280 "
- >05A0 " 1400 "
- >0A00 " 2560 "
- >0B40 " 2880 "
-
- >50B8 = Byte: Flag for Drive # 1 when an 80 Track Drive is used with a
- 40 track diskette. If the Most Significant Bit of this byte is
- set to 1, then the drive is an 80 track drive, but the
- diskette is a 40 track diskette. In other words, this bit flag
- enables double step of magnetic head in read a write
- operations.
-
- >50B9 = Byte: Drive 1 SECTOR/TRACK. Usually is either >09 (Single
- Density, or >10 (Double Density 16 Sector/Track) or >12 (Double
- Density 18 Sector/Track).
-
- *----- DRIVE 2 -----*
-
- >50BA - >50BB = Word: Drive 2 Maximum # of sector/disk. This value is taken
- from sector ZERO, offset >10, of the diskette you are using.
- It is always updated whenever you access sector ZERO.
-
- It will be:
- >0168 for 360 sectors
- >0280 " 640 "
- >02D0 " 720 "
- >0500 " 1280 "
- >05A0 " 1400 "
- >0A00 " 2560 "
- >0B40 " 2880 "
-
- >50BC = Byte: Flag for Drive # 2 when an 80 Track Drive is used with a
- 40 track diskette. If the Most Significant Bit of this byte is
- set to 1, then the drive is an 80 track drive, but the
- diskette is a 40 track diskette. In other words, this bit flag
- enables double step of magnetic head in read a write
- operations.
-
- >50BD = Byte: Drive 2 SECTOR/TRACK. Usually is either >09 (Single
- Density, or >10 (Double Density 16 Sector/Track) or >12 (Double
- Density 18 Sector/Track).
-
- *----- DRIVE 3 -----*
-
- >50BE - >50BF = Word: Drive 3 Maximum # of sector/disk. This value is taken
- from sector ZERO, offset >10, of the diskette you are using.
- It is always updated whenever you access sector ZERO.
-
- It will be:
- >0168 for 360 sectors
- >0280 " 640 "
- >02D0 " 720 "
- >0500 " 1280 "
- >05A0 " 1400 "
- >0A00 " 2560 "
- >0B40 " 2880 "
-
- >50C0 = Byte: Flag for Drive # 3 when an 80 Track Drive is used with a
- 40 track diskette. If the Most Significant Bit of this byte is
- set to 1, then the drive is an 80 track drive, but the
- diskette is a 40 track diskette. In other words, this bit flag
- enables double step of magnetic head in read a write
- operations.
-
- >50C1 = Byte: Drive 3 SECTOR/TRACK. Usually is either >09 (Single
- Density, or >10 (Double Density 16 Sector/Track) or >12 (Double
- Density 18 Sector/Track).
-
- *----- DRIVE 4 -----*
-
- >50C2 - >50C3 = Word: Drive 4 Maximum # of sector/disk. This value is taken
- from sector ZERO, offset >10, of the diskette you are using.
- It is always updated whenever you access sector ZERO.
-
- It will be:
- >0168 for 360 sectors
- >0280 " 640 "
- >02D0 " 720 "
- >0500 " 1280 "
- >05A0 " 1400 "
- >0A00 " 2560 "
- >0B40 " 2880 "
-
- >50C4 = Byte: Flag for Drive # 4 when an 80 Track Drive is used with a
- 40 track diskette. If the Most Significant Bit of this byte is
- set to 1, then the drive is an 80 track drive, but the
- diskette is a 40 track diskette. In other words, this bit flag
- enables double step of magnetic head in read a write
- operations.
-
- >50C5 = Byte: Drive 4 SECTOR/TRACK. Usually is either >09 (Single
- Density, or >10 (Double Density 16 Sector/Track) or >12 (Double
- Density 18 Sector/Track).
-
- *------ LAST TRACK ACCESSED
- >50C6 = Byte: Last track accessed of Drive # 1
- >50C7 = Byte: " " " of Drive # 2
- >50C8 = Byte: " " " of Drive # 3
- >50C9 = Byte: " " " of Drive # 4
- *-----------------------------------------------------------------------------*
-
- >50CA = Word: DSRLNK (or EPROM bank 1) RETURN ADDRESS
-
- >50CC = Byte: Flag. If ZERO, the the diskette has been previously
- accessed. If different from ZERO, then the diskette is handled
- as if it was never been accessed previously: therefore Sector
- zero is Read and the DISKETTE TYPE INFORMATION AREA is
- updated. Also, this byte is <>0 after a Read/Write sector
- error.
-
- >50CD = Byte: Flag. HARD VERIFY DISABLED. It reflects the condition
- of CRU bit 2 after a TB (TB 2). If ZERO, then VERIFY is
- ENABLED.
-
- PLEASE NOTE THAT A VERIFY IN MYARC DC ONLY IMPLIES READING
- BACK THE GIVEN SECTOR (to >4000 EPROM, a "deaf" area!). No
- match between the diskette sector content and the BUFFER area
- is ever performed This, in my opinion, is a strange approach.
- Myarc approach is entirely different from TI and CORCOMP, that
- do allow checking of the written sector against the BUFFER
- content. The Myarc Verify is based only on CRC, LOST DATA,
- SECTOR NOT FOUND ERRORS. It does not ensure that all the bytes
- you have passed to the diskette have been really written on
- the diskette. If, by any means, you bump into an hardware or
- software failure AND a different sector is accessed, NO ERROR
- IS EVER REPORTED!
-
- If the >50CD byte is different from ZERO, then VERIFY is
- disabled.
-
- >50CE = Byte: Flag. If ZERO, then the Read/Write sector and
- Initialize routnes will use the VPD RAM BUFFER.
-
- If different from ZERO, then the same routines will use a CPU
- RAM BUFFER (pointed, as usual, by the sane address in the FAC
- area. This way is faster than having to deal with VPD buffer.
-
- >50CF - = Byte: # of maximum files you can open from Basic or Assembler.
- It is the # of Files you want to allow with a CALL FILES from
- Basic.
-
- Paolo Bagnaresi, Via J.F. Kennedy 17, San Donato Milanese, Italy ~- % ~-
- File name : MYARC-FDC2 Stored on disk TECH-NOTES
-
- * Filename : MYARC-FDC2 - Actual code example is on files 80T-INIT-A thru D
- ****************************************************************************
- * MYARC DISK CONTROLLER INFORMATIONS
- ********************************************************************************
-
- Paolo Bagnaresi
- Via Kennedy 17
- 20097 San donato Milanese
- ITALY - Phone (02)-514.202
-
- ********************************************************************************
- INTERNAL RAM ORGANIZATION (follows from previous file)
- =========================
-
- >50D0 - >51CF = >100 bytes taken from sector ZERO of the diskette last
- accessed. This is the standard layout of sector ZERO.
-
- >50D0 - >50D9 = 10 bytes: DISKNAME, padded to the right with blancks.
-
- >50DA - >50DB = Total sector/disk:
- >0168 for 360 sectors
- >0280 " 640 "
- >02D0 " 720 "
- >0500 " 1280 "
- >05A0 " 1400 "
- >0A00 " 2560 "
- >0B40 " 2880 "
-
- >50DC = Byte: Sector/Track.
- - >09 = 9 (Single Density)
- - >10 = 16 (Double Density Myarc)
- - >12 = 18 (Double Density Myarc or CorComp).
-
- >50DD - >50DF = 3 Bytes: 'DSK' identifier.
-
- >50E0 = Byte: Disk Proprietary Protection
- >20 -> Not protected, >50 Protected.
-
- >50E1 = Byte: Track/Side. Usually either >28 (40 Track) or >50 (80
- Track).
-
- >50E2 = Byte: Disk Side. >01 Single Side, >02 Double Side.
-
- >50E3 = Byte: Disk Density. >01 Single Density, >02 Double Density.
-
- >50E4 - >5107 = All >0000. Reserved area.
-
- >5018 ..>51CF = Used sector bit map. The actual lenght depends on a
- side/density factor. There are:
-
- >2D (45) bytes for Single Side/Single Dens. ( 9 Sector/Track)
- >5A (90) " " Double " / " " ( 9 " / " )
- >5A (90) " " Single " /Double " (18 " / " )
- >A0 (160) " " Double " / " " (16 " / " )
- >B4 (180) " " " " / " " (18 " / " )
-
- DISK BUFFERING AREA: The last FILE CONTROL BLOCK # available is always used
- before the others.
- *******************
-
- 1st FILE CONTROL BLOCK= >108 bytes: 8 bytes for description, >100 bytes sector
- -------------------------------------------------------------------------------
-
- >50D0 = Byte: EOF offset for DIS/VAR type file. It will be zeroed when
- the file is closed.
-
- >51D1 = Byte: Drive # used, real number. It will be zeroed when the
- file is closed.
-
- >51D2 - >52D3 = Sector # where the NAME OF THE FILE is kept.
-
- >51D4 - >50D5 = Word: The first nibble is the FILE/TYPE. The second nibble,
- and the second byte, together, point to the last used sector.
-
- >51D6 - >51D7 = Word: Total sectors engaged for this file.
-
- >51D8 - >52D7 = >100 bytes brought directly from the NAME OF THE FILE sector.
- OFFSET
-
- >51D8 - >51E1 = >00 10 Bytes= FILENAME
- >51E2 - >51E3 = >0A Word = >0000 = Reserved
-
- >51E4 = >0C Byte = File Status Flag (File Type and Write
- Protection)
-
- >51E5 = >0D Byte = Max # of records per Sector = >03 for a 80
- DIS/VAR file.
-
- >51E6 - >51E7 = >0E Word = Number of sectors currently allocated.
-
- >51E8 = >10 Byte = End Of File offset within the last used sector.
- >51E9 = >11 Byte = Logical Record Length. >50 for a DIS/VAR 80
- file.
-
- >51EA - >51EB = >12 Word = # of FIXED length records or # of sectors for
- VARIABLE length (the bytes are reversed, LSB|MSB
- should be MSB|LSB.
-
- >51EC - >51F3 = >14 4 Words = >0000,>0000,>0000,>0000 : Reserved.
- >51F4 - >51F6 = >1C 3 Bytes = Sector # of first sector and # of following
- sectors. Nibble are reversed. Also, if next
- 3 bytes are not zero, fracturing map.
-
- 2nd FILE CONTROL BLOCK = >108 bytes: 8 bytes for description, >100 bytes sector
- -------------------------------------------------------------------------------
-
- >52D8 = Byte: EOF offset for DIS/VAR type file. It will be zeroed when
- the file is closed.
-
- >52D9 = Byte: Drive # used, real number. It will be zeroed when the
- file is closed.
- >52DA - >52DB = Sector # where the NAME OF THE FILE is kept.
-
- >52DC - >50DD = Word: The first nibble is the FILE/TYPE. The second nibble,
- and the second byte, together, point to the last used sector.
-
- >52DE - >52DF = Word: Total sectors engaged for this file.
-
- >52E0 - >53DF = >100 bytes brought directly from the NAME OF THE FILE sector.
- OFFSET
-
- >52E0 - >52E9 = >00 10 Bytes= FILENAME
- >52EA - >52EB = >0A Word = >0000 = Reserved
-
- >52EC >0C Byte = File Status Flag (File Type and Write
- Protection)
-
- >52ED = >0D Byte = Max # of records per Sector = >03 for a 80
- DIS/VAR file.
-
- >52EE - >52EF = >0E Word = Number of sectors currently allocated.
-
- >52F0 = >10 Byte = End Of File offset within the last used sector.
- >52F1 = >11 Byte = Logical Record Length. >50 for a DIS/VAR 80
- file.
-
- >52F2 - >52F3 = >12 Word = # of FIXED length records or # of sectors for
- VARIABLE length (the bytes are reversed, LSB|MSB
- should be MSB|LSB.
-
- >52F4 - >52FB = >14 4 Words = >0000,>0000,>0000,>0000 : Reserved.
- >52FC - >52FE = >1C 3 Bytes = Sector # of first sector and # of following
- sectors. Nibble are reversed. Also, if next
- 3 bytes are not zero, fracturing map.
-
- 3rd FILE CONTROL BLOCK = >108 bytes: 8 bytes for description, >100 bytes sector
- -------------------------------------------------------------------------------
-
- >53E0 = Byte: EOF offset for DIS/VAR type file. It will be zeroed when
- the file is closed.
-
- >53E1 = Byte: Drive # used, real number. It will be zeroed when the
- file is closed.
-
- >53E2 - >53E3 = Sector # where the NAME OF THE FILE is kept.
-
- >53E4 - >53E5 = Word: The first nibble is the FILE/TYPE. The second nibble,
- and the second byte, together, point to the last used sector.
-
- >53E6 - >53E7 = Word: Total sectors engaged for this file.
-
- >53E8 - >54E7 = >100 bytes brought directly from the NAME OF THE FILE sector.
-
- OFFSET
-
- >53E8 - >53F1 = >00 10 Bytes= FILENAME
- >53F2 - >53F3 = >0A Word = >0000 = Reserved
-
- >53F4 = >0C Byte = File Status Flag (File Type and Write
- Protection)
-
- >53F5 = >0D Byte = Max # of records per Sector = >03 for a 80
- DIS/VAR file.
-
- >53F6 - >53F7 = >0E Word = Number of sectors currently allocated.
-
- >53F8 = >10 Byte = End Of File offset within the last used sector.
- >53F9 = >11 Byte = Logical Record Length. >50 for a DIS/VAR 80
- file.
-
- >53FA - >53FB = >12 Word = # of FIXED length records or # of sectors for
- VARIABLE length (the bytes are reversed, LSB|MSB
- should be MSB|LSB.
-
- >53FC - >5403 = >14 4 Words = >0000,>0000,>0000,>0000 : Reserved.
- >5404 - >5406 = >1C 3 Bytes = Sector # of first sector and # of following
- sectors. Nibble are reversed. Also, if next
- 3 bytes are not zero, fracturing map.
-
- 4th FILE CONTROL BLOCK = >108 bytes: 8 bytes for description, >100 bytes sector
- -------------------------------------------------------------------------------
-
- >54E8 = Byte: EOF offset for DIS/VAR type file. It will be zeroed when
- the file is closed.
-
- >54E9 = Byte: Drive # used, real number. It will be zeroed when the
- file is closed.
- >54EA - >54EB = Sector # where the NAME OF THE FILE is kept.
-
- >54EC - >54ED = Word: The first nibble is the FILE/TYPE. The second nibble,
- and the second byte, together, point to the last used sector.
-
- >54EE - >54EF = Word: Total sectors engaged for this file.
-
- >54F0 - >55EF = >100 bytes brought directly from the NAME OF THE FILE sector.
-
- OFFSET
-
- >54F0 - >54F9 = >00 10 Bytes= FILENAME
- >54FA - >54FB = >0A Word = >0000 = Reserved
-
- >54FC >0C Byte = File Status Flag (File Type and Write
- Protection)
-
- >54FD = >0D Byte = Max # of records per Sector = >03 for a 80
- DIS/VAR file.
-
- >54FE - >54FF = >0E Word = Number of sectors currently allocated.
-
- >5500 = >10 Byte = End Of File offset within the last used sector.
- >5501 = >11 Byte = Logical Record Length. >50 for a DIS/VAR 80
- file.
-
- >5502 - >5503 = >12 Word = # of FIXED length records or # of sectors for
- VARIABLE length (the bytes are reversed, LSB|MSB
- should be MSB|LSB.
-
- >5504 - >550B = >14 4 Words = >0000,>0000,>0000,>0000 : Reserved.
- >550C - >550E = >1C 3 Bytes = Sector # of first sector and # of following
- sectors. Nibble are reversed. Also, if next
- 3 bytes are not zero, fracturing map.
-
- 5th FILE CONTROL BLOCK = >108 bytes: 8 bytes for description, >100 bytes sector
- -------------------------------------------------------------------------------
-
- >55F0 = Byte: EOF offset for DIS/VAR type file. It will be zeroed when
- the file is closed.
-
- >55F1 = Byte: Drive # used, real number. It will be zeroed when the
- file is closed.
- >55F2 - >55F3 = Sector # where the NAME OF THE FILE is kept.
-
- >55F4 - >55F5 = Word: The first nibble is the FILE/TYPE. The second nibble,
- and the second byte, together, point to the last used sector.
-
- >55F6 - >55F7 = Word: Total sectors engaged for this file.
-
- >55F8 - >56F7 = >100 bytes brought directly from the NAME OF THE FILE sector.
-
- OFFSET
-
- >55F8 - >5601 = >00 10 Bytes= FILENAME
- >5602 - >5603 = >0A Word = >0000 = Reserved
-
- >5604 = >0C Byte = File Status Flag (File Type and Write
- Protection)
-
- >5605 = >0D Byte = Max # of records per Sector = >03 for a 80
- DIS/VAR file.
-
- >5606 - >5607 = >0E Word = Number of sectors currently allocated.
-
- >5608 = >10 Byte = End Of File offset within the last used sector.
- >5609 = >11 Byte = Logical Record Length. >50 for a DIS/VAR 80
- file.
-
- >560A - >560B = >12 Word = # of FIXED length records or # of sectors for
- VARIABLE length (the bytes are reversed, LSB|MSB
- should be MSB|LSB.
-
- >560C - >5613 = >14 4 Words = >0000,>0000,>0000,>0000 : Reserved.
- >5614 - >5616 = >1C 3 Bytes = Sector # of first sector and # of following
- sectors. Nibble are reversed. Also, if next
- 3 bytes are not zero, fracturing map.
-
- 6th FILE CONTROL BLOCK = >108 bytes: 8 bytes for description, >100 bytes sector
- -------------------------------------------------------------------------------
-
- >56F8 = Byte: EOF offset for DIS/VAR type file. It will be zeroed when
- the file is closed.
-
- >56F9 = Byte: Drive # used, real number. It will be zeroed when the
- file is closed.
- >56FA - >56FB = Sector # where the NAME OF THE FILE is kept.
-
- >56FC - >56FD = Word: The first nibble is the FILE/TYPE. The second nibble,
- and the second byte, together, point to the last used sector.
-
- >56FE - >56FF = Word: Total sectors engaged for this file.
-
- >5700 - >57FF = >100 bytes brought directly from the NAME OF THE FILE sector.
-
- OFFSET
-
- >5700 - >5709 = >00 10 Bytes= FILENAME
- >570A - >570B = >0A Word = >0000 = Reserved
-
- >570C >0C Byte = File Status Flag (File Type and Write
- Protection)
-
- >570D = >0D Byte = Max # of records per Sector = >03 for a 80
- DIS/VAR file.
-
- >570E - >570F = >0E Word = Number of sectors currently allocated.
-
- >5710 = >10 Byte = End Of File offset within the last used sector.
- >5711 = >11 Byte = Logical Record Length. >50 for a DIS/VAR 80
- file.
-
- >5712 - >5713 = >12 Word = # of FIXED length records or # of sectors for
- VARIABLE length (the bytes are reversed, LSB|MSB
- should be MSB|LSB.
-
- >5714 - >571B = >14 4 Words = >0000,>0000,>0000,>0000 : Reserved.
- >571C - >571E = >1C 3 Bytes = Sector # of first sector and # of following
- sectors. Nibble are reversed. Also, if next
- 3 bytes are not zero, fracturing map.
-
- ********************************************************************************
- >577F Note = Last location in Myarc FDC RAM.
-
- ------------------------------------------------------------------------------
- DTIHM039
-
- DX-10 Opcodes and Mnemonics.
-
- [EDITORS NOTE: DX-10 was the operating system used by Texas Instruments 990
- series of Minicomputers. Besides being (mostly) compatable
- with the 99/4a on the assembly level, much software and
- hardware development for the 99/4a was done on the mini
- computers. ]
-
- THE FOLLOWING TEXT DEFINES ALL THE POSSIBLE TAGS FOUND IN A DX/10 OBJECT FILE:
- -------------------------------------------------------------------------------
- Field 1: Is always 4 bytes long, and contains a Value or Address in ASCII-HEX.
- But if it is compressed object code, this field is compressed down to
- 2 bytes and the data is stored in internal BINARY-WORD format.
-
- Field 2: Is always 6 bytes long, and contains Symbol characters, except for its
- use in the first record of the object file and the first TAG of `0'.
- During this use, this field is expanded by two bytes, to make room for
- the 8 byte long `PROGRAM ID' text.
-
- Field 3: Is always 4 bytes long, and contains a Module No. from >0000 to >0FFF.
- Start at >0000 for all DATA segments (DSEG) in the source files. The
- next Module No. >0001 is for all PROGRAM segments (PSEG), but since it
- is the default mode for all of the OBJECT code,it is never included in
- any TAG field. The rest of the Module Numbers from>0002 up until >0FFF
- are for all the different COMMON segments (CSEG). Each COMMON segment
- with a different Field 2 (Symbol) is assigned a new Module Number. The
- number of COMMON segments allowed varies depending on the amount of
- memory available for the Assembler. Linker and Loader programs; but if
- it is compressed OBJECT code, this field is compressed down to 2 bytes
- and the Module Number is stored in internal BINARY-WORD format.
-
- -------------------------------------------------------------------------------
- SPECIAL TAGs: The 7,8,F,: TAGs are designed to control the file format of the
- OBJECT file, and are used to check for errors in the last record,
- and to mark the ends of each file,and the end of the OBJECT file.
- The `U' TAG is generated by the LOAD directive, and allows the
- source files to force a symbol and address to be loaded into the
- REF/DEF table for later use. The `D' TAG is generated by the user
- and allows the user to have a bias or offset added on all TAGs
- containing a relocatable address. The G,H,I,K,#TAGs are currently
- not used or no more information is available on them.
-
- T SPECIAL CTRL TAG USE: Field 1 Field 2 Field 3
- - ---------------------- ---------------------------- ---------- ---------
- 7 = Checksum Indicator Checksum Value
- 8 = Checksum Ignore Any Data Value
- D = Load Bias or Offset Load Bias (user added)
- U = Force a REF/DEF load Absolute Address Symbol
- F = End of Record (line #)
- : = End of File (99/4 AS)
- - ---------------------- ---------------------------- ---------- ---------
- G =
- H =
- I = Program Identification
- K = External Macro REF Relocatable Address of Chain Symbol
- # = Absolute Value >007F????
-
- -------------------------------------------------------------------------------
- ALL & AORG: These TAGs are found in code which is AORG or used to mark Absolute
- Data (B) like OPcodes, etc. in all other kinds of segments.
-
- T ALL & AORG TAG USE: Field 1 Field 2 Field 3
- - ---------------------- ---------------------------- ---------- ---------
- 1 = Entry Point Definition Absolute Address
- 4 = External References Absolute Address
- 6 = External Definitions Absolute Address
- 6 = Load Address Absolute Address
- B = Data Absolute Value
-
- -------------------------------------------------------------------------------
- PSEG TAG USE: These TAGs are found in code which is inbetween the PSEG and PEND
- Assembler Directives. This is the default mode of all code which
- is not marked with one of the XSEG directives. Also, code marked
- with the RORG directive will end up as PSEG tagged code. These
- TAGs define all the PROGRAM segments in an assembled program, and
- also mark the main-relocatable part of the program. Program ID,
- (Field 2) is 8 bytes long, instead of the normal 6 byte field,and
- always is the first TAG in any object file,and only appears once.
- If the IDT directive was not used in the source file, then this
- field is padded out with 8 space characters.
-
- T PSEG TAG USE: Field 1 Field 2 Field 3
- - ---------------------- ---------------------------- ---------- ---------
- 0 = Program Identification Total Length of all PSEG's Program ID
- 2 = Entry Point Definition Relocatable Address
- 3 = External References Relocatable Address of Chain Symbol
- 5 = External Definitions Relocatable Address of Chain Symbol
- V = External Secondary REF Relocatable Address of Chain Symbol
- A = Load Address Relocatable Address
- C = Data Relocatable Address
-
- -------------------------------------------------------------------------------
- DSEG TAG USE: These TAGs are found in code which is inbetween the DSEG and DEND
- Assembler Directives. It defines all DATA segments in a assembled
- program, and also marks the modifiable segments of the program.
- The second field in the `M'TAG is fixed to the symbol of `$DATA',
- and only can appear once in any given object file.
-
- T DSEG TAG USE: Field 1 Field 2 Field 3
- - ---------------------- ---------------------------- ---------- ---------
- M = Module Identification Total Length of all DSEG's $DATA >0000
- X = External References Relocatable Address of Chain Symbol >0000
- W = External Definitions Relocatable Address of Chain Symbol >0000
- V = External Secondary REF Relocatable Address of Chain Symbol >0000
- S = Load Address Relocatable Address
- T = Data Relocatable Address
-
- -------------------------------------------------------------------------------
- CSEG TAG USE: These TAGs are found in code which is inbetween the CSEG and CEND
- Assembler Directives. It defines all the COMMON Module Segments
- in an assembled program. Since the COMMON segments are defined as
- separate modules with unique ID's, then these TAGs are useful in
- marking the page-relocatable parts of the program. The second
- field in the `M' TAG is defined by each CSEG [`string'], and can
- be any 6 byte Symbol. All CSEG directives using the same Symbol,
- are all considered part of the same module, and are all assigned
- the same Module No. Any CSEG directives without a Symbol, are all
- assigned the same default Symbol of`$BLANK' for use in the second
- field of the `M' TAG.
-
- T CSEG TAG USE: Field 1 Field 2 Field 3
- - ---------------------- ---------------------------- ---------- ---------
- M = Modules Identification Length of a certain Module # Symbol Module #.
- X = External References Relocatable Address of Chain Symbol Module #.
- W = External Definitions Relocatable Address of Chain Symbol Module #.
- V = External Secondary REF Relocatable Address of Chain Symbol Module #.
- P = Load Address Relocatable Address Module #.
- N = Data Relocatable Address Module #.
-
- ------------------------------------------------------------------------------
- THE FOLLOWING TEXT DEFINES ALL THE SPECIAL MNEMONICS IN A DX/10 SOURCE FILE:
- -------------------------------------------------------------------------------
- These OPcodes are found in all 9900 based systems starting at the 9900CPU chip,
- all the way up to the latest 99000 CPU. But due to the fact that these OPcodes
- output a special CRU address on the system bus, they can't be used correctly in
- 99/4a type systems. Only the RSET and IDLE should ever be attempted in a 99/4a
- system, but we don't recommend it. These OPcodes are designed to interface with
- special CRU hardware to control various user-defined functions.
-
- OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F
- ---- ----- ---------------------------------- ---------------------------------
- IDLE >0340 IDLE until a reset, interrupt,load |0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0|
- RSET >0360 ReSET status bits 12-15 to zero |0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0|
- CKON >03A0 ClocK ON (user) |0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0|
- CKOF >03C0 ClocK OFF (user) |0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0|
- LREX >03E0 Load or REstart eXecution (user) |0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0|
-
- -------------------------------------------------------------------------------
- These OPcodes are only found in 9940 based systems using the 9940 CPU chip. But
- since they assemble using the XOP OPcode, it is possible to make them available
- on other 9900 based systems. On the 99/4a the DCA (XOP 0)vectors are: CRU >1B00
- WS >2800, PC >4028 (Extended GPL mode),and for the DCS (XOP 2) the vectors are:
- WS >FFD8, PC >FFF8. The LIIM opcode is a special verion of the normal LIMI for
- the 9940, as the 9940 only has max. 4 levels of interrupts and the mormal LIMI
- allows up to 16 levels of interrupts. The LIIM is not needed on the 99/4a as
- this system only has one fixed level of interrupts; but if you need to emulate
- this OPcode for any reason, the vectors on the 99/4a for LIIM (XOP 0) are:
- WS >83A0, PC >8300.
-
- OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F
- ---- ----- ---------------------------------- ---------------------------------
- DCA >2C00 Decimal Correct Addition XOP0 |0 0 1 0 1 1|0 0 0 0| Ts| S |
- DCS >2C40 Decimal Correct Subtraction XOP1 |0 0 1 0 1 1|0 0 0 1| Ts| S |
- LIIM >2C80 Load Immediate Interrupt Mask XOP2 |0 0 1 0 1 1|0 0 1 0| x | n |
-
-
- -------------------------------------------------------------------------------
- These OPcodes are found in the 990/10 mainframe system, and also in any 99000
- based system. They are designed to support the 99610 memory mapper, to allow
- easy access to another page without the need of switching a page someplace.
- They can also be emulated in a 9995 based system thru the MID interrupt.
-
- OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F
- ---- ----- ---------------------------------- ---------------------------------
- LDS >0780 Long Distance Source |0 0 0 0 0 1 1 1 1 0| Ts| S |
- LDD >07C0 Long Distance Destination |0 0 0 0 0 1 1 1 1 1| Ts| S |
-
- -------------------------------------------------------------------------------
- These OPcodes currently are not known about in any 9900 or possible 9900 based
- system,only the LMF has one small line about it in the 99000 manual. Its format
- is LMF Rx,x; where the Rx can be any workspace register from 0 thru 15, and the
- immediate can be a `0' or a `1'. The XIT opcode does not have any operands, and
- is just used by itself. It is not mentioned in any 9900 or 99000 reference
- manual, and lloks to me like a special opcode to return or eXIT from something.
-
- OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F
- ---- ----- ---------------------------------- ---------------------------------
- LMF >0320 ????(not in any known 9900 system) |0 0 0 0 0 0 1 1 0 0 1|n| W |
- ---- ----- ---------------------------------- ---------------------------------
- XIT >0C0E ????(not in any known 9900 system) |0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0|
-
- -------------------------------------------------------------------------------
- These OPcodes are only found in 99000 based systems using the 99110A CPU chip.
- They are designed to provide a floating point package for 9900 based systems;
- but they can also be emulated in a 9995 based system thru the MID interrupt.
-
- OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F
- ---- ----- ---------------------------------- ---------------------------------
- AR >0C40 Add Real |0 0 0 0 1 1 0 0 0 1| Ts| S |
- CIR >0C80 Convert Integer to Real |0 0 0 0 1 1 0 0 1 0| Ts| S |
- SR >0CC0 Subtract Real |0 0 0 0 1 1 0 0 1 1| Ts| S |
- MR >0D00 Multiply Real |0 0 0 0 1 1 0 1 0 0| Ts| S |
- DR >0D40 Divide Real |0 0 0 0 1 1 0 1 0 1| Ts| S |
- LR >0D80 Load Real |0 0 0 0 1 1 0 1 1 0| Ts| S |
- STR >0DC0 Store Real |0 0 0 0 1 1 0 1 1 1| Ts| S |
- ---- ----- ---------------------------------- ---------------------------------
- CRI >0C00 Convert Real to Integer |0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0|
- NEGR >0C02 Negate Real |0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0|
- CRE >0C04 Convert Real to Extended integer |0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0|
- CRE >0C06 Convert Extended integer to Real |0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0|
-
- -------------------------------------------------------------------------------
- These OPcodes are currently not found in any 9900 based system;but if emulated,
- they are designed to provide an easy-to-use BCDecimal package for 9900 based
- systems. They can be emulated in a 9995 based system thru the MID interrupt.
-
- OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F
- ---- ----- ---------------------------------- ---------------------------------
- AD >0E40 Add Decimal |0 0 0 0 1 1 1 0 0 1| Ts| S |
- CID >0E80 Convert Integer to Decimal |0 0 0 0 1 1 1 0 1 0| Ts| S |
- SD >0EC0 Subtract Decimal |0 0 0 0 1 1 1 0 1 1| Ts| S |
- MD >0F00 Multiply Decimal |0 0 0 0 1 1 1 1 0 0| Ts| S |
- DD >0F40 Divide Decimal |0 0 0 0 1 1 1 1 0 1| Ts| S |
- LD >0F80 Load Decimal |0 0 0 0 1 1 1 1 1 0| Ts| S |
- STD >0FC0 Store Decimal |0 0 0 0 1 1 1 1 1 1| Ts| S |
- ---- ----- ---------------------------------- ---------------------------------
- CDI >0C01 Convert Decimal to Integer |0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1|
- CDE >0C05 Convert Decimal to Extended integer|0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1|
- CED >0C07 Convert Extended integer to Decimal|0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1|
- ------------------------------------------------------------------------------
- THE FOLLOWING TEXT DEFINES ALL THE OPCODES AND MNEMONICS IN A 9900/99000 SYSTEM
-
- OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F
- ----- ---- ---------------------------------- ---------------------------------
- >0000 (16 opcodes available) |0 0 0 0 0 0 0 0 0 0 0 0|- - - -|
- >0010 ( 8 opcodes available) |0 0 0 0 0 0 0 0 0 0 0 1 0|- - -|
- >0018 ( 4 opcodes available) |0 0 0 0 0 0 0 0 0 0 0 1 1 0|- -|
- >001C SRAM Shift Right Arithmetic Multiple 32|0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0|
- >001D SLAM Shift Left Arithmetic Multiple 32|0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1|
- >001E ( 2 opcodes available) |0 0 0 0 0 0 0 0 0 0 0 1 1 1 1|-|
- >0020 ( 8 opcodes available) |0 0 0 0 0 0 0 0 0 0 1 0 0|- - -|
- >0028 ( 1 opcode available) |0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0|
- >0029 AM Add Multiple 32|0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1|
- >002A SM Subtract Multiple 32|0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0|
- >002B ( 1 opcode available) |0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1|
- >002C ( 4 opcodes available) |0 0 0 0 0 0 0 0 0 0 1 0 1 1|- -|
- >0030 (16 opcodes available) |0 0 0 0 0 0 0 0 0 0 1 1|- - - -|
- >0040 (64 opcodes available) |0 0 0 0 0 0 0 0 0 1|- - - - - -|
- >0080 LST Load STatus register |0 0 0 0 0 0 0 0 1 0 0 0| W |
- >0090 LWP Load Workspace Pointer |0 0 0 0 0 0 0 0 1 0 0 1| W |
- >00A0 (16 opcodes available) |0 0 0 0 0 0 0 0 1 0 1 0|- - - -|
- >00B0 BLSK Branch immediate & Link to StacK |0 0 0 0 0 0 0 0 1 0 1 1| W |
- >00C0 (64 opcodes available) |0 0 0 0 0 0 0 0 1 1|- - - - - -|
- >0100 EVAD EValuate ADdress instruction |0 0 0 0 0 0 0 1 0 0| Ts| S |
- >0140 BIND Branch INDirect |0 0 0 0 0 0 0 1 0 1| Ts| S |
- >0180 DIVS DIVide-Signed |0 0 0 0 0 0 0 1 1 0| Ts| S |
- >01C0 MPYS MultiPlY-Signed |0 0 0 0 0 0 0 1 1 1| Ts| S |
- >0200 LI Load Immediate |0 0 0 0 0 0 1 0 0 0 0 0| W |
- >0210 (16 opcodes available) |0 0 0 0 0 0 1 0 0 0 0 1|- - - -|
- >0220 AI Add Immediate |0 0 0 0 0 0 1 0 0 0 1 0| W |
- >0230 (16 opcodes available) |0 0 0 0 0 0 1 0 0 0 1 1|- - - -|
- >0240 ANDI AND Immediate |0 0 0 0 0 0 1 0 0 1 0 0| W |
- >0250 (16 opcodes available) |0 0 0 0 0 0 1 0 0 1 0 1|- - - -|
- >0260 ORI OR Immediate |0 0 0 0 0 0 1 0 0 1 1 0| W |
- >0270 (16 opcodes available) |0 0 0 0 0 0 1 0 0 1 1 1|- - - -|
- >0280 CI Compare Immediate |0 0 0 0 0 0 1 0 1 0 0 0| W |
- >0290 (16 opcodes available) |0 0 0 0 0 0 1 0 1 0 0 1|- - - -|
- >02A0 STWP STore Workspace Pointer |0 0 0 0 0 0 1 0 1 0 1 0| W |
- >02B0 (16 opcodes available) |0 0 0 0 0 0 1 0 1 0 1 1|- - - -|
- >02C0 STST STore STatus |0 0 0 0 0 0 1 0 1 1 0 0| W |
- >02D0 (16 opcodes available) |0 0 0 0 0 0 1 0 1 1 0 1|- - - -|
- >02E0 LWPI Load Workspace Pointer Immediate |0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0|
- >02E1 ( 1 opcode available) |0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1|
- >02E2 ( 2 opcodes available) |0 0 0 0 0 0 1 0 1 1 1 0 0 0 1|-|
- >02E4 ( 4 opcodes available) |0 0 0 0 0 0 1 0 1 1 1 0 0 1|- -|
- >02E8 ( 8 opcodes available) |0 0 0 0 0 0 1 0 1 1 1 0 1|- - -|
- >02F0 (16 opcodes available) |0 0 0 0 0 0 1 0 1 1 1 1|- - - -|
- >0300 LIMI Load Interrupt Mask Immediate |0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0|
- >0301 CR Compare Reals 32|0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1|
- >0302 MM Multiply Multiple 32|0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0|
- >0303 ( 1 opcode available) |0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1|
- >0304 ( 4 opcodes available) |0 0 0 0 0 0 1 1 0 0 0 0 0 1|- -|
- >0308 ( 8 opcodes available) |0 0 0 0 0 0 1 1 0 0 0 0 1|- - -|
- >0310 (16 opcodes available) |0 0 0 0 0 0 1 1 0 0 0 1|- - - -|
- >0320 LMF ????(not in any known 9900 system) |0 0 0 0 0 0 1 1 0 0 1|n| W |
- >0340 IDLE IDLE until a reset, interrupt,load |0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0|
- >0341 ( 1 opcode available) |0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1|
- >0342 ( 2 opcodes available) |0 0 0 0 0 0 1 1 0 1 0 0 0 0 1|-|
- >0344 ( 4 opcodes available) |0 0 0 0 0 0 1 1 0 1 0 0 0 1|- -|
- >0348 ( 8 opcodes available) |0 0 0 0 0 0 1 1 0 1 0 0 1|- - -|
- >0350 (16 opcodes available) |0 0 0 0 0 0 1 1 0 1 0 1|- - - -|
-
- OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F
- ----- ---- ---------------------------------- ---------------------------------
- >0360 RSET ReSET the status bits 12-15 to zero|0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0|
- >0361 ( 1 opcode available) |0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1|
- >0362 ( 2 opcodes available) |0 0 0 0 0 0 1 1 0 1 1 0 0 0 1|-|
- >0364 ( 4 opcodes available) |0 0 0 0 0 0 1 1 0 1 1 0 0 1|- -|
- >0368 ( 8 opcodes available) |0 0 0 0 0 0 1 1 0 1 1 0 1|- - -|
- >0370 (16 opcodes available) |0 0 0 0 0 0 1 1 0 1 1 1|- - - -|
- >0380 RTWP ReTurn with Workspace Pointer |0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0|
- >0381 ( 1 opcode available) |0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1|
- >0382 ( 2 opcodes available) |0 0 0 0 0 0 1 1 1 0 0 0 0 0 1|-|
- >0384 ( 4 opcodes available) |0 0 0 0 0 0 1 1 1 0 0 0 0 1|- -|
- >0388 ( 8 opcodes available) |0 0 0 0 0 0 1 1 1 0 0 0 1|- - -|
- >0390 (16 opcodes available) |0 0 0 0 0 0 1 1 1 0 0 1|- - - -|
- >03A0 CKON ClocK ON (user) |0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0|
- >03A1 ( 1 opcode available) |0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1|
- >03A2 ( 2 opcodes available) |0 0 0 0 0 0 1 1 1 0 1 0 0 0 1|-|
- >03A4 ( 4 opcodes available) |0 0 0 0 0 0 1 1 1 0 1 0 0 1|- -|
- >03A8 ( 8 opcodes available) |0 0 0 0 0 0 1 1 1 0 1 0 1|- - -|
- >03B0 (16 opcodes available) |0 0 0 0 0 0 1 1 1 0 1 1|- - - -|
- >03C0 CKOF ClocK OFf (user) |0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0|
- >03C1 ( 1 opcode available) |0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1|
- >03C2 ( 2 opcodes available) |0 0 0 0 0 0 1 1 1 1 0 0 0 0 1|-|
- >03C4 ( 4 opcodes available) |0 0 0 0 0 0 1 1 1 1 0 0 0 1|- -|
- >03C8 ( 8 opcodes available) |0 0 0 0 0 0 1 1 1 1 0 0 1|- - -|
- >03D0 (16 opcodes available) |0 0 0 0 0 0 1 1 1 1 0 1|- - - -|
- >03E0 LREX Load or REstart eXecution (user) |0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0|
- >03E1 ( 1 opcode available) |0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1|
- >03E2 ( 2 opcodes available) |0 0 0 0 0 0 1 1 1 1 1 0 0 0 1|-|
- >03E4 ( 4 opcodes available) |0 0 0 0 0 0 1 1 1 1 1 0 0 1|- -|
- >03E8 ( 8 opcodes available) |0 0 0 0 0 0 1 1 1 1 1 0 1|- - -|
- >03F0 (16 opcodes available) |0 0 0 0 0 0 1 1 1 1 1 1|- - - -|
- >0400 BLWP Branch and Load Workspace Pointer |0 0 0 0 0 1 0 0 0 0| Ts| S |
- >0440 B Branch |0 0 0 0 0 1 0 0 0 1| Ts| S |
- >0480 X eXecute |0 0 0 0 0 1 0 0 1 0| Ts| S |
- >04C0 CLR CLeaR operand to zeros |0 0 0 0 0 1 0 0 1 1| Ts| S |
- >0500 NEG NEGate operand |0 0 0 0 0 1 0 1 0 0| Ts| S |
- >0540 INV INVert operand |0 0 0 0 0 1 0 1 0 1| Ts| S |
- >0580 INC INCrement operand by one |0 0 0 0 0 1 0 1 1 0| Ts| S |
- >05C0 INCT INCrement operand by Two |0 0 0 0 0 1 0 1 1 1| Ts| S |
- >0600 DEC DECrement operand by one |0 0 0 0 0 1 1 0 0 0| Ts| S |
- >0640 DECT DECrement operand by Two |0 0 0 0 0 1 1 0 0 1| Ts| S |
- >0680 BL Branch and Link |0 0 0 0 0 1 1 0 1 0| Ts| S |
- >06C0 SWPB SWaP Bytes |0 0 0 0 0 1 1 0 1 1| Ts| S |
- >0700 SETO SET operand to Ones |0 0 0 0 0 1 1 1 0 0| Ts| S |
- >0740 ABS ABSolute operand |0 0 0 0 0 1 1 1 0 1| Ts| S |
- >0780 LDS Long Distance Source |0 0 0 0 0 1 1 1 1 0| Ts| S |
- >07C0 LDD Long Distance Destination |0 0 0 0 0 1 1 1 1 1| Ts| S |
- >0800 SRA Shift register Right Arithmetic |0 0 0 0 1 0 0 0| count | W |
- >0900 SRL Shift register Right Logical |0 0 0 0 1 0 0 1| count | W |
- >0A00 SLA Shift register Left Arithmetic |0 0 0 0 1 0 1 0| count | W |
- >0B00 SRC Shift register Right Circular |0 0 0 0 1 0 1 1| count | W |
- >0C00 CRI Convert Real to Integer |0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0|
- >0C01 CDI Convert Decimal to Integer |0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1|
- >0C02 NEGR NEGate Real |0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0|
- >0C03 ( 1 opcode available) |0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1|
- >0C04 CRE Convert Real to Extended integer |0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0|
- >0C05 CDE Convert Decimal to Extended integer|0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1|
- >0C06 CER Convert Extended integer to Real |0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0|
- >0C07 CED Convert Extended integer to Decimal|0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1|
- >0C08 ( 1 opcode available) |0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0|
-
- OPCODE Meanings of Mnemonics and Opcodes 0 1 2 3 4 5 6 7 8 9 A B C D E F
- _____ ____ __________________________________ _________________________________
- >0C09 TMB Test Memory Bit 32|0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 1|
- >0C0A TCMB Test and Clear Memory Bit 32|0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0|
- >0C0B TSMB Test and Set Memory Bit 32|0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 1|
- >0C0C ( 2 opcodes available) |0 0 0 0 1 1 0 0 0 0 0 0 1 1 0|-|
- >0C0E XIT ????(not in any known 9900 system) |0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0|
- >0C0F ( 1 opcode available) |0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1|
- >0C10 (16 opcodes available) |0 0 0 0 1 1 0 0 0 0 0 1|- - - -|
- >0C20 (32 opcodes available) |0 0 0 0 1 1 0 0 0 0 1|- - - - -|
- >0C40 AR Add Real |0 0 0 0 1 1 0 0 0 1| Ts| S |
- >0C80 CIR Convert Integer to Real |0 0 0 0 1 1 0 0 1 0| Ts| S |
- >0CC0 SR Subtract Real |0 0 0 0 1 1 0 0 1 1| Ts| S |
- >0D00 MR Multiply Real |0 0 0 0 1 1 0 1 0 0| Ts| S |
- >0D40 DR Divide Real |0 0 0 0 1 1 0 1 0 1| Ts| S |
- >0D80 LR Load Real |0 0 0 0 1 1 0 1 1 0| Ts| S |
- >0DC0 SR Store Real |0 0 0 0 1 1 0 1 1 1| Ts| S |
- >0E40 AD Add Decimal |0 0 0 0 1 1 1 0 0 1| Ts| S |
- >0E80 CID Convert Integer to Decimal |0 0 0 0 1 1 1 0 1 0| Ts| S |
- >0EC0 SD Subtract Decimal |0 0 0 0 1 1 1 0 1 1| Ts| S |
- >0F00 MD Multiply Decimal |0 0 0 0 1 1 1 1 0 0| Ts| S |
- >0F40 DD Divide Decimal |0 0 0 0 1 1 1 1 0 1| Ts| S |
- >0F80 LD Load Decimal |0 0 0 0 1 1 1 1 1 0| Ts| S |
- >0FC0 SD Store Decimal |0 0 0 0 1 1 1 1 1 1| Ts| S |
- >1000 JMP unconditional JuMP |0 0 0 1 0 0 0 0| displacement |
- >1100 JLT Jump if Less Than |0 0 0 1 0 0 0 1| displacement |
- >1200 JLE Jump if Low or Equal |0 0 0 1 0 0 1 0| displacement |
- >1300 JEQ Jump if EQual |0 0 0 1 0 0 1 1| displacement |
- >1400 JHE Jump if High or Equal |0 0 0 1 0 1 0 0| displacement |
- >1500 JGT Jump if Greater Than |0 0 0 1 0 1 0 1| displacement |
- >1600 JNE Jump if Not Equal |0 0 0 1 0 1 1 0| displacement |
- >1700 JNC Jump if No Carry |0 0 0 1 0 1 1 1| displacement |
- >1800 JOC Jump if On Carry |0 0 0 1 1 0 0 0| displacement |
- >1900 JNO Jump if No Overflow |0 0 0 1 1 0 0 1| displacement |
- >1A00 JL Jump if logical Low |0 0 0 1 1 0 1 0| displacement |
- >1B00 JH Jump if logical High |0 0 0 1 1 0 1 1| displacement |
- >1C00 JOP Jump if Odd Parity |0 0 0 1 1 1 0 0| displacement |
- >1D00 SBO Set CRU Bit to One |0 0 0 1 1 1 0 1| displacement |
- >1E00 SBZ Set CRU Bit to Zero |0 0 0 1 1 1 1 0| displacement |
- >1F00 TB Test Bit |0 0 0 1 1 1 1 1| displacement |
- >2000 COC Compare Ones Corresponding |0 0 1 0 0 0| WsD | Ts| S |
- >2400 CZC Compare Zeros Corresponding |0 0 1 0 0 1| WsD | Ts| S |
- >2800 XOR eXclusive OR |0 0 1 0 1 0| WsD | Ts| S |
- >2C00 XOP eXtended OPeration & (DCA,DCS,LIIM)|0 0 1 0 1 1| n | Ts| S |
- >3000 LDCR LoaD Communication Register |0 0 1 1 0 0| count | Ts| S |
- >3400 STCR STore Communication Register |0 0 1 1 0 1| count | Ts| S |
- >3800 MPY MultiPlY |0 0 1 1 1 0| WsD | Ts| S |
- >3C00 DIV DIVide |0 0 1 1 1 1| WsD | Ts| S |
- >4000 SZC Set Zeros Corresponding |0 1 0 0| Td| D | Ts| S |
- >5000 SZCB Set Zeros Corresponding, Byte |0 1 0 1| Td| D | Ts| S |
- >6000 S Subtract words |0 1 1 0| Td| D | Ts| S |
- >7000 SB Subtract Bytes |0 1 1 1| Td| D | Ts| S |
- >8000 C Compare words |1 0 0 0| Td| D | Ts| S |
- >9000 CB Compare Bytes |1 0 0 1| Td| D | Ts| S |
- >A000 A Add words |1 0 1 0| Td| D | Ts| S |
- >B000 AB Add Bytes |1 0 1 1| Td| D | Ts| S |
- >C000 MOV MOVe words |1 1 0 0| Td| D | Ts| S |
- >D000 MOVB MOVe Bytes |1 1 0 1| Td| D | Ts| S |
- >E000 SOC Set Ones Corresponding |1 1 1 0| Td| D | Ts| S |
- >F000 SOCB Set Ones Corresponding, Byte |1 1 1 1| Td| D | Ts| S |
- -------------------------------------------------------------------------------
- <eof-12.29.96>
-